AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Player Class Reference

#include "Player.h"

Inheritance diagram for Player:
Unit GridObject< Player > WorldObject Object WorldLocation Position

Classes

struct  BgBattlegroundQueueID_Rec
 
struct  ChatFloodThrottle
 

Public Types

typedef std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
 
typedef std::set< uint32DFQuestsDoneList
 
- Public Types inherited from Unit
typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 Player (WorldSession *session)
 
 ~Player () override
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void SetObjectScale (float scale) override
 
bool TeleportTo (uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
 
bool TeleportTo (WorldLocation const &loc, uint32 options=0, Unit *target=nullptr)
 
bool TeleportToEntryPoint ()
 
void SetSummonPoint (uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
 
bool IsSummonAsSpectator () const
 
void SetSummonAsSpectator (bool on)
 
void SummonIfPossible (bool agree, ObjectGuid summoner_guid)
 
time_t GetSummonExpireTimer () const
 
bool Create (ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
 
void Update (uint32 time) override
 
PlayerFlags GetPlayerFlags () const
 
bool HasPlayerFlag (PlayerFlags flags) const
 
void SetPlayerFlag (PlayerFlags flags)
 
void RemovePlayerFlag (PlayerFlags flags)
 
void ReplaceAllPlayerFlags (PlayerFlags flags)
 
bool IsClass (Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
 
void SetInWater (bool apply)
 
bool IsInWater () const override
 
bool IsFalling () const
 
bool IsInAreaTriggerRadius (AreaTrigger const *trigger, float delta=0.f) const
 
void SendInitialPacketsBeforeAddToMap ()
 
void SendInitialPacketsAfterAddToMap ()
 
void SendTransferAborted (uint32 mapid, TransferAbortReason reason, uint8 arg=0)
 
void SendInstanceResetWarning (uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
 
bool CanInteractWithQuestGiver (Object *questGiver)
 
CreatureGetNPCIfCanInteractWith (ObjectGuid const &guid, uint32 npcflagmask)
 
GameObjectGetGameObjectIfCanInteractWith (ObjectGuid const &guid, GameobjectTypes type) const
 
void ToggleAFK ()
 
void ToggleDND ()
 
bool isAFK () const
 
bool isDND () const
 
uint8 GetChatTag () const
 
uint32 GetBarberShopCost (uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
 
PlayerSocialGetSocial ()
 
void InitTaxiNodesForLevel ()
 
bool ActivateTaxiPathTo (std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
 
bool ActivateTaxiPathTo (uint32 taxi_path_id, uint32 spellid=1)
 
void CleanupAfterTaxiFlight ()
 
void ContinueTaxiFlight ()
 
void SendTaxiNodeStatusMultiple ()
 
bool IsCommentator () const
 
void SetCommentator (bool on)
 
bool IsDeveloper () const
 
void SetDeveloper (bool on)
 
void SetBeastMaster (bool on)
 
bool isAcceptWhispers () const
 
void SetAcceptWhispers (bool on)
 
bool IsGameMaster () const
 
void SetGameMaster (bool on)
 
bool isGMChat () const
 
void SetGMChat (bool on)
 
bool IsGMSpectator () const
 
void SetGMSpectator (bool on)
 
bool isTaxiCheater () const
 
void SetTaxiCheater (bool on)
 
bool isGMVisible () const
 
void SetGMVisible (bool on)
 
bool Has310Flyer (bool checkAllSpells, uint32 excludeSpellId=0)
 
void SetHas310Flyer (bool on)
 
void SetPvPDeath (bool on)
 
void GiveXP (uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
 
void GiveLevel (uint8 level)
 
void InitStatsForLevel (bool reapplyMods=false)
 
bool HasActivePowerType (Powers power) override
 
bool GetCommandStatus (uint32 command) const
 
void SetCommandStatusOn (uint32 command)
 
void SetCommandStatusOff (uint32 command)
 
uint32 GetTotalPlayedTime ()
 
uint32 GetLevelPlayedTime ()
 
void setDeathState (DeathState s, bool despawn=false) override
 
void SetRestState (uint32 triggerId)
 
void RemoveRestState ()
 
uint32 GetXPRestBonus (uint32 xp)
 
float GetRestBonus () const
 
void SetRestBonus (float restBonusNew)
 
bool HasRestFlag (RestFlag restFlag) const
 
void SetRestFlag (RestFlag restFlag, uint32 triggerId=0)
 
void RemoveRestFlag (RestFlag restFlag)
 
uint32 GetInnTriggerId () const
 
PetStableGetPetStable ()
 
PetStableGetOrInitPetStable ()
 
PetStable const * GetPetStable () const
 
PetGetPet () const
 
PetSummonPet (uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0ms, uint32 healthPct=0)
 
void RemovePet (Pet *pet, PetSaveMode mode, bool returnreagent=false)
 
bool CanPetResurrect ()
 
bool IsExistPet ()
 
PetCreatePet (Creature *creatureTarget, uint32 spellID=0)
 
PetCreatePet (uint32 creatureEntry, uint32 spellID=0)
 
uint32 GetPhaseMaskForSpawn () const
 
void Say (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles said message in regular chat based on declared language and in config pre-defined Range.
 
void Say (uint32 textId, WorldObject const *target=nullptr) override
 
void Yell (std::string_view text, Language language, WorldObject const *=nullptr) override
 Handles yelled message in regular chat based on declared language and in config pre-defined Range.
 
void Yell (uint32 textId, WorldObject const *target=nullptr) override
 
void TextEmote (std::string_view text, WorldObject const *=nullptr, bool=false) override
 Outputs an universal text which is supposed to be an action.
 
void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false) override
 
void Whisper (std::string_view text, Language language, Player *receiver, bool=false) override
 Handles whispers from Addons and players based on sender, receiver's guid and language.
 
void Whisper (uint32 textId, Player *target, bool isBossWhisper=false) override
 
void SetVirtualItemSlot (uint8 i, Item *item)
 
void SetSheath (SheathState sheathed) override
 
uint8 FindEquipSlot (ItemTemplate const *proto, uint32 slot, bool swap) const
 
uint32 GetItemCount (uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
 
uint32 GetItemCountWithLimitCategory (uint32 limitCategory, Item *skipItem=nullptr) const
 
ItemGetItemByGuid (ObjectGuid guid) const
 
ItemGetItemByEntry (uint32 entry) const
 
ItemGetItemByPos (uint16 pos) const
 
ItemGetItemByPos (uint8 bag, uint8 slot) const
 
BagGetBagByPos (uint8 slot) const
 
uint32 GetFreeInventorySpace () const
 
ItemGetUseableItemByPos (uint8 bag, uint8 slot) const
 
ItemGetWeaponForAttack (WeaponAttackType attackType, bool useable=false) const
 
bool HasWeapon (WeaponAttackType type) const override
 
bool HasWeaponForAttack (WeaponAttackType type) const override
 
ItemGetShield (bool useable=false) const
 
std::vector< Item * > & GetItemUpdateQueue ()
 
bool IsValidPos (uint16 pos, bool explicit_pos)
 
bool IsValidPos (uint8 bag, uint8 slot, bool explicit_pos)
 
uint8 GetBankBagSlotCount () const
 
void SetBankBagSlotCount (uint8 count)
 
bool HasItemCount (uint32 item, uint32 count=1, bool inBankAlso=false) const
 
bool HasItemFitToSpellRequirements (SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
 
bool CanNoReagentCast (SpellInfo const *spellInfo) const
 
bool HasItemOrGemWithIdEquipped (uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
 
bool HasItemOrGemWithLimitCategoryEquipped (uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
 
InventoryResult CanTakeMoreSimilarItems (Item *pItem) const
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count) const
 
InventoryResult CanStoreNewItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
 
InventoryResult CanStoreItems (Item **pItem, int32 count) const
 
InventoryResult CanEquipNewItem (uint8 slot, uint16 &dest, uint32 item, bool swap) const
 
InventoryResult CanEquipItem (uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanEquipUniqueItem (Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanEquipUniqueItem (ItemTemplate const *itemProto, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
 
InventoryResult CanUnequipItems (uint32 item, uint32 count) const
 
InventoryResult CanUnequipItem (uint16 src, bool swap) const
 
InventoryResult CanBankItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
 
InventoryResult CanUseItem (Item *pItem, bool not_loading=true) const
 
bool HasItemTotemCategory (uint32 TotemCategory) const
 
bool IsTotemCategoryCompatiableWith (ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
 
InventoryResult CanUseItem (ItemTemplate const *pItem) const
 
InventoryResult CanUseAmmo (uint32 item) const
 
InventoryResult CanRollForItemInLFG (ItemTemplate const *item, WorldObject const *lootedObject) const
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
 
ItemStoreNewItem (ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet &allowedLooters)
 
ItemStoreItem (ItemPosCountVec const &pos, Item *pItem, bool update)
 
ItemEquipNewItem (uint16 pos, uint32 item, bool update)
 
ItemEquipItem (uint16 pos, Item *pItem, bool update)
 
void AutoUnequipOffhandIfNeed (bool force=false)
 
bool StoreNewItemInBestSlots (uint32 item_id, uint32 item_count)
 
void AutoStoreLoot (uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
 
void AutoStoreLoot (uint32 loot_id, LootStore const &store, bool broadcast=false)
 
LootItemStoreLootItem (uint8 lootSlot, Loot *loot, InventoryResult &msg)
 
void UpdateLootAchievements (LootItem *item, Loot *loot)
 
void UpdateTitansGrip ()
 
InventoryResult CanTakeMoreSimilarItems (uint32 entry, uint32 count, Item *pItem, uint32 *no_space_count=nullptr) const
 
InventoryResult CanStoreItem (uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 entry, uint32 count, Item *pItem=nullptr, bool swap=false, uint32 *no_space_count=nullptr) const
 
void AddRefundReference (ObjectGuid itemGUID)
 
void DeleteRefundReference (ObjectGuid itemGUID)
 
void ApplyEquipCooldown (Item *pItem)
 
void SetAmmo (uint32 item)
 
void RemoveAmmo ()
 
float GetAmmoDPS () const
 
bool CheckAmmoCompatibility (ItemTemplate const *ammo_proto) const
 
void QuickEquipItem (uint16 pos, Item *pItem)
 
void VisualizeItem (uint8 slot, Item *pItem)
 
void SetVisibleItemSlot (uint8 slot, Item *pItem)
 
ItemBankItem (ItemPosCountVec const &dest, Item *pItem, bool update)
 
void RemoveItem (uint8 bag, uint8 slot, bool update, bool swap=false)
 
void MoveItemFromInventory (uint8 bag, uint8 slot, bool update)
 
void MoveItemToInventory (ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
 
void RemoveItemDependentAurasAndCasts (Item *pItem)
 
void DestroyItem (uint8 bag, uint8 slot, bool update)
 
void DestroyItemCount (uint32 item, uint32 count, bool update, bool unequip_check=false)
 
void DestroyItemCount (Item *item, uint32 &count, bool update)
 
void DestroyConjuredItems (bool update)
 
void DestroyZoneLimitedItem (bool update, uint32 new_zone)
 
void SplitItem (uint16 src, uint16 dst, uint32 count)
 
void SwapItem (uint16 src, uint16 dst)
 
void AddItemToBuyBackSlot (Item *pItem, uint32 money)
 
ItemGetItemFromBuyBackSlot (uint32 slot)
 
void RemoveItemFromBuyBackSlot (uint32 slot, bool del)
 
uint32 GetMaxKeyringSize () const
 
void SendEquipError (InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
 
void SendBuyError (BuyResult msg, Creature *creature, uint32 item, uint32 param)
 
void SendSellError (SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
 
void AddWeaponProficiency (uint32 newflag)
 
void AddArmorProficiency (uint32 newflag)
 
uint32 GetWeaponProficiency () const
 
uint32 GetArmorProficiency () const
 
bool IsTwoHandUsed () const
 
void SendNewItem (Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
 
bool BuyItemFromVendorSlot (ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
 
bool _StoreOrEquipNewItem (uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
 
float GetReputationPriceDiscount (Creature const *creature) const
 
float GetReputationPriceDiscount (FactionTemplateEntry const *factionTemplate) const
 
PlayerGetTrader () const
 
TradeDataGetTradeData () const
 
void TradeCancel (bool sendback, TradeStatus status=TRADE_STATUS_TRADE_CANCELED)
 
CinematicMgrGetCinematicMgr () const
 
void UpdateEnchantTime (uint32 time)
 
void UpdateSoulboundTradeItems ()
 
void AddTradeableItem (Item *item)
 
void RemoveTradeableItem (Item *item)
 
void UpdateItemDuration (uint32 time, bool realtimeonly=false)
 
void AddEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurations (Item *item)
 
void RemoveEnchantmentDurationsReferences (Item *item)
 
void RemoveArenaEnchantments (EnchantmentSlot slot)
 
void AddEnchantmentDuration (Item *item, EnchantmentSlot slot, uint32 duration)
 
void ApplyEnchantment (Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
 
void ApplyEnchantment (Item *item, bool apply)
 
void UpdateSkillEnchantments (uint16 skill_id, uint16 curr_value, uint16 new_value)
 
void SendEnchantmentDurations ()
 
void UpdateEnchantmentDurations ()
 
void BuildEnchantmentsInfoData (WorldPacket *data)
 
void AddItemDurations (Item *item)
 
void RemoveItemDurations (Item *item)
 
void SendItemDurations ()
 
void LoadCorpse (PreparedQueryResult result)
 
void LoadPet ()
 
bool AddItem (uint32 itemId, uint32 count)
 
void PrepareGossipMenu (WorldObject *source, uint32 menuId=0, bool showQuests=false)
 
void SendPreparedGossip (WorldObject *source)
 
void OnGossipSelect (WorldObject *source, uint32 gossipListId, uint32 menuId)
 
uint32 GetGossipTextId (uint32 menuId, WorldObject *source)
 
uint32 GetGossipTextId (WorldObject *source)
 
void ToggleInstantFlight ()
 
int32 GetQuestLevel (Quest const *quest) const
 
void PrepareQuestMenu (ObjectGuid guid)
 
void SendPreparedQuest (ObjectGuid guid)
 
bool IsActiveQuest (uint32 quest_id) const
 
Quest const * GetNextQuest (ObjectGuid guid, Quest const *quest)
 
bool CanSeeStartQuest (Quest const *quest)
 
bool CanTakeQuest (Quest const *quest, bool msg)
 
bool CanAddQuest (Quest const *quest, bool msg)
 
bool CanCompleteQuest (uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
 
bool CanCompleteRepeatableQuest (Quest const *quest)
 
bool CanRewardQuest (Quest const *quest, bool msg)
 
bool CanRewardQuest (Quest const *quest, uint32 reward, bool msg)
 
void AddQuestAndCheckCompletion (Quest const *quest, Object *questGiver)
 
void AddQuest (Quest const *quest, Object *questGiver)
 
void AbandonQuest (uint32 quest_id)
 
void CompleteQuest (uint32 quest_id)
 
void IncompleteQuest (uint32 quest_id)
 
void RewardQuest (Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
 
void SetRewardedQuest (uint32 quest_id)
 
void FailQuest (uint32 quest_id)
 
bool SatisfyQuestSkill (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLevel (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestLog (bool msg)
 
bool SatisfyQuestPreviousQuest (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestClass (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestRace (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestReputation (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestStatus (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestConditions (Quest const *qInfo, bool msg)
 
bool SatisfyQuestTimed (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestExclusiveGroup (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestNextChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestPrevChain (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestDay (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestWeek (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestMonth (Quest const *qInfo, bool msg) const
 
bool SatisfyQuestSeasonal (Quest const *qInfo, bool msg) const
 
bool GiveQuestSourceItem (Quest const *quest)
 
bool TakeQuestSourceItem (uint32 questId, bool msg)
 
uint32 CalculateQuestRewardXP (Quest const *quest)
 
bool GetQuestRewardStatus (uint32 quest_id) const
 
QuestStatus GetQuestStatus (uint32 quest_id) const
 
void SetQuestStatus (uint32 questId, QuestStatus status, bool update=true)
 
void RemoveActiveQuest (uint32 questId, bool update=true)
 
void RemoveRewardedQuest (uint32 questId, bool update=true)
 
void SendQuestUpdate (uint32 questId)
 
QuestGiverStatus GetQuestDialogStatus (Object *questGiver)
 
float GetQuestRate (bool isDFQuest=false)
 
void SetDailyQuestStatus (uint32 quest_id)
 
bool IsDailyQuestDone (uint32 quest_id)
 
void SetWeeklyQuestStatus (uint32 quest_id)
 
void SetMonthlyQuestStatus (uint32 quest_id)
 
void SetSeasonalQuestStatus (uint32 quest_id)
 
void ResetDailyQuestStatus ()
 
void ResetWeeklyQuestStatus ()
 
void ResetMonthlyQuestStatus ()
 
void ResetSeasonalQuestStatus (uint16 event_id)
 
uint16 FindQuestSlot (uint32 quest_id) const
 
uint32 GetQuestSlotQuestId (uint16 slot) const
 
uint32 GetQuestSlotState (uint16 slot) const
 
uint16 GetQuestSlotCounter (uint16 slot, uint8 counter) const
 
uint32 GetQuestSlotTime (uint16 slot) const
 
void SetQuestSlot (uint16 slot, uint32 quest_id, uint32 timer=0)
 
void SetQuestSlotCounter (uint16 slot, uint8 counter, uint16 count)
 
void SetQuestSlotState (uint16 slot, uint32 state)
 
void RemoveQuestSlotState (uint16 slot, uint32 state)
 
void SetQuestSlotTimer (uint16 slot, uint32 timer)
 
void SwapQuestSlot (uint16 slot1, uint16 slot2)
 
uint16 GetReqKillOrCastCurrentCount (uint32 quest_id, int32 entry)
 
void AreaExploredOrEventHappens (uint32 questId)
 
void GroupEventHappens (uint32 questId, WorldObject const *pEventObject)
 
void ItemAddedQuestCheck (uint32 entry, uint32 count)
 
void ItemRemovedQuestCheck (uint32 entry, uint32 count)
 
void KilledMonster (CreatureTemplate const *cInfo, ObjectGuid guid)
 
void KilledMonsterCredit (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void KilledPlayerCredit (uint16 count=1)
 
void KilledPlayerCreditForQuest (uint16 count, Quest const *quest)
 
void KillCreditGO (uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
 
void TalkedToCreature (uint32 entry, ObjectGuid guid)
 
void MoneyChanged (uint32 value)
 
void ReputationChanged (FactionEntry const *factionEntry)
 
void ReputationChanged2 (FactionEntry const *factionEntry)
 
bool HasQuestForItem (uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
 
bool HasQuestForGO (int32 GOId) const
 
bool HasQuest (uint32 questId) const
 
void UpdateForQuestWorldObjects ()
 
bool CanShareQuest (uint32 quest_id) const
 
void SendQuestComplete (uint32 quest_id)
 
void SendQuestReward (Quest const *quest, uint32 XP)
 
void SendQuestFailed (uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
 
void SendQuestTimerFailed (uint32 quest_id)
 
void SendCanTakeQuestResponse (uint32 msg) const
 
void SendQuestConfirmAccept (Quest const *quest, Player *pReceiver)
 
void SendPushToPartyResponse (Player const *player, uint8 msg) const
 
void SendQuestUpdateAddItem (Quest const *quest, uint32 item_idx, uint16 count)
 
void SendQuestUpdateAddCreatureOrGo (Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
 
void SendQuestUpdateAddPlayer (Quest const *quest, uint16 old_count, uint16 add_count)
 
ObjectGuid GetDivider ()
 
void SetDivider (ObjectGuid guid=ObjectGuid::Empty)
 
uint32 GetInGameTime ()
 
void SetInGameTime (uint32 time)
 
void AddTimedQuest (uint32 quest_id)
 
void RemoveTimedQuest (uint32 quest_id)
 
bool HasPvPForcingQuest () const
 
bool LoadFromDB (ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
 
bool isBeingLoaded () const override
 
void Initialize (ObjectGuid::LowType guid)
 
void SaveToDB (bool create, bool logout)
 
void SaveToDB (CharacterDatabaseTransaction trans, bool create, bool logout)
 
void SaveInventoryAndGoldToDB (CharacterDatabaseTransaction trans)
 
void SaveGoldToDB (CharacterDatabaseTransaction trans)
 
void _SaveSkills (CharacterDatabaseTransaction trans)
 
void SetBindPoint (ObjectGuid guid)
 
void SendTalentWipeConfirm (ObjectGuid guid)
 
void ResetPetTalents ()
 
void RegenerateAll ()
 
void Regenerate (Powers power)
 
void RegenerateHealth ()
 
void setRegenTimerCount (uint32 time)
 
void setWeaponChangeTimer (uint32 time)
 
uint32 GetMoney () const
 
bool ModifyMoney (int32 amount, bool sendError=true)
 
bool HasEnoughMoney (uint32 amount) const
 
bool HasEnoughMoney (int32 amount) const
 
void SetMoney (uint32 value)
 
RewardedQuestSet const & getRewardedQuests () const
 
QuestStatusMapgetQuestStatusMap ()
 
QuestStatusSaveMapGetQuestStatusSaveMap ()
 
std::size_t GetRewardedQuestCount () const
 
bool IsQuestRewarded (uint32 quest_id) const
 
UnitGetSelectedUnit () const
 
PlayerGetSelectedPlayer () const
 
void SetTarget (ObjectGuid=ObjectGuid::Empty) override
 
void SetSelection (ObjectGuid guid)
 Used for serverside target changes, does not apply to players.
 
void SendMailResult (uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
 
void SendNewMail ()
 
void UpdateNextMailTimeAndUnreads ()
 
void AddNewMailDeliverTime (time_t deliver_time)
 
void RemoveMail (uint32 id)
 
void AddMail (Mail *mail)
 
uint32 GetMailSize ()
 
MailGetMail (uint32 id)
 
PlayerMails const & GetMails () const
 
void SendItemRetrievalMail (uint32 itemEntry, uint32 count)
 
void SendItemRetrievalMail (std::vector< std::pair< uint32, uint32 > > mailItems)
 
ItemGetMItem (ObjectGuid::LowType itemLowGuid)
 
void AddMItem (Item *it)
 
bool RemoveMItem (ObjectGuid::LowType itemLowGuid)
 
void PetSpellInitialize ()
 
void CharmSpellInitialize ()
 
void PossessSpellInitialize ()
 
void VehicleSpellInitialize ()
 
void SendRemoveControlBar ()
 
bool HasSpell (uint32 spell) const override
 
bool HasActiveSpell (uint32 spell) const
 
TrainerSpellState GetTrainerSpellState (TrainerSpell const *trainer_spell) const
 
bool IsSpellFitByClassAndRace (uint32 spell_id) const
 
bool IsNeedCastPassiveSpellAtLearn (SpellInfo const *spellInfo) const
 
void SendProficiency (ItemClass itemClass, uint32 itemSubclassMask)
 
void SendInitialSpells ()
 
void SendLearnPacket (uint32 spellId, bool learn)
 
bool addSpell (uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
 
bool _addSpell (uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
 
void learnSpell (uint32 spellId, bool temporary=false, bool learnFromSkill=false)
 
void removeSpell (uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
 
void resetSpells ()
 
void LearnCustomSpells ()
 
void LearnDefaultSkills ()
 
void LearnDefaultSkill (uint32 skillId, uint16 rank)
 
void learnQuestRewardedSpells ()
 
void learnQuestRewardedSpells (Quest const *quest)
 
void learnSpellHighRank (uint32 spellid)
 
bool CheckSkillLearnedBySpell (uint32 spellId)
 
void SetReputation (uint32 factionentry, float value)
 
uint32 GetReputation (uint32 factionentry) const
 
std::string const & GetGuildName ()
 
uint32 GetFreeTalentPoints () const
 
void SetFreeTalentPoints (uint32 points)
 
bool resetTalents (bool noResetCost=false)
 
uint32 resetTalentsCost () const
 
bool IsMaxLevel () const
 
void InitTalentForLevel ()
 
void BuildPlayerTalentsInfoData (WorldPacket *data)
 
void BuildPetTalentsInfoData (WorldPacket *data)
 
void SendTalentsInfoData (bool pet)
 
void LearnTalent (uint32 talentId, uint32 talentRank, bool command=false)
 
void LearnPetTalent (ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
 
bool addTalent (uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
 
void _removeTalent (PlayerTalentMap::iterator &itr, uint8 specMask)
 
void _removeTalent (uint32 spellId, uint8 specMask)
 
void _removeTalentAurasAndSpells (uint32 spellId)
 
void _addTalentAurasAndSpells (uint32 spellId)
 
bool HasTalent (uint32 spell_id, uint8 spec) const
 
uint32 CalculateTalentsPoints () const
 
void SetBonusTalentCount (uint32 count)
 
uint32 GetBonusTalentCount ()
 
void AddBonusTalent (uint32 count)
 
void RemoveBonusTalent (uint32 count)
 
void UpdateSpecCount (uint8 count)
 
uint8 GetActiveSpec () const
 
uint8 GetActiveSpecMask () const
 
void SetActiveSpec (uint8 spec)
 
uint8 GetSpecsCount () const
 
void SetSpecsCount (uint8 count)
 
void ActivateSpec (uint8 spec)
 
void LoadActions (PreparedQueryResult result)
 
void GetTalentTreePoints (uint8(&specPoints)[3]) const
 
uint8 GetMostPointsTalentTree () const
 
bool HasTankSpec ()
 
bool HasMeleeSpec ()
 
bool HasCasterSpec ()
 
bool HasHealSpec ()
 
uint32 GetSpec (int8 spec=-1)
 
void InitGlyphsForLevel ()
 
void SetGlyphSlot (uint8 slot, uint32 slottype)
 
uint32 GetGlyphSlot (uint8 slot) const
 
void SetGlyph (uint8 slot, uint32 glyph, bool save)
 
uint32 GetGlyph (uint8 slot) const
 
uint32 GetFreePrimaryProfessionPoints () const
 
void SetFreePrimaryProfessions (uint16 profs)
 
void InitPrimaryProfessions ()
 
PlayerSpellMap const & GetSpellMap () const
 
PlayerSpellMapGetSpellMap ()
 
SpellCooldowns const & GetSpellCooldownMap () const
 
SpellCooldownsGetSpellCooldownMap ()
 
SkillStatusMap const & GetSkillStatusMap () const
 
SkillStatusMapGetSkillStatusMap ()
 
void AddSpellMod (SpellModifier *mod, bool apply)
 
bool IsAffectedBySpellmod (SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
 
bool HasSpellMod (SpellModifier *mod, Spell *spell)
 
template<class T >
void ApplySpellMod (uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
 
void RemoveSpellMods (Spell *spell)
 
void RestoreSpellMods (Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void RestoreAllSpellMods (uint32 ownerAuraId=0, Aura *aura=nullptr)
 
void DropModCharge (SpellModifier *mod, Spell *spell)
 
void SetSpellModTakingSpell (Spell *spell, bool apply)
 
bool HasSpellCooldown (uint32 spell_id) const override
 
bool HasSpellItemCooldown (uint32 spell_id, uint32 itemid) const override
 
uint32 GetSpellCooldownDelay (uint32 spell_id) const
 
void AddSpellAndCategoryCooldowns (SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
 
void AddSpellCooldown (uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
 
void _AddSpellCooldown (uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void ModifySpellCooldown (uint32 spellId, int32 cooldown)
 
void SendCooldownEvent (SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
 
void ProhibitSpellSchool (SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
 
void RemoveSpellCooldown (uint32 spell_id, bool update=false)
 
void SendClearCooldown (uint32 spell_id, Unit *target)
 
GlobalCooldownMgrGetGlobalCooldownMgr ()
 
void RemoveCategoryCooldown (uint32 cat)
 
void RemoveArenaSpellCooldowns (bool removeActivePetCooldowns=false)
 
void RemoveAllSpellCooldown ()
 
void _LoadSpellCooldowns (PreparedQueryResult result)
 
void _SaveSpellCooldowns (CharacterDatabaseTransaction trans, bool logout)
 
uint32 GetLastPotionId ()
 
void SetLastPotionId (uint32 item_id)
 
void UpdatePotionCooldown (Spell *spell=nullptr)
 
void setResurrectRequestData (ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
 
void clearResurrectRequestData ()
 
bool isResurrectRequestedBy (ObjectGuid guid) const
 
bool isResurrectRequested () const
 
void ResurectUsingRequestData ()
 
uint8 getCinematic () const
 
void setCinematic (uint8 cine)
 
ActionButtonaddActionButton (uint8 button, uint32 action, uint8 type)
 
void removeActionButton (uint8 button)
 
ActionButton const * GetActionButton (uint8 button)
 
void SendInitialActionButtons () const
 
void SendActionButtons (uint32 state) const
 
bool IsActionButtonDataValid (uint8 button, uint32 action, uint8 type)
 
void UpdatePvPState ()
 
void UpdateFFAPvPState (bool reset=true)
 
void SetPvP (bool state)
 
void UpdatePvP (bool state, bool _override=false)
 
void UpdateZone (uint32 newZone, uint32 newArea, bool force=false)
 
void UpdateArea (uint32 newArea)
 
void SetNeedZoneUpdate (bool needUpdate)
 
void UpdateZoneDependentAuras (uint32 zone_id)
 
void UpdateAreaDependentAuras (uint32 area_id)
 
void UpdateAfkReport (time_t currTime)
 checks the 15 afk reports per 5 minutes limit
 
void UpdatePvPFlag (time_t currTime)
 
void UpdateFFAPvPFlag (time_t currTime)
 
void UpdateContestedPvP (uint32 currTime)
 
void SetContestedPvPTimer (uint32 newTime)
 
void ResetContestedPvP ()
 
void UpdateDuelFlag (time_t currTime)
 
void CheckDuelDistance (time_t currTime)
 
void DuelComplete (DuelCompleteType type)
 
void SendDuelCountdown (uint32 counter)
 
bool IsGroupVisibleFor (Player const *p) const
 
bool IsInSameGroupWith (Player const *p) const
 
bool IsInSameRaidWith (Player const *p) const
 
void UninviteFromGroup ()
 
void RemoveFromGroup (RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT)
 
void SendUpdateToOutOfRangeGroupMembers ()
 
void SetInGuild (uint32 GuildId)
 
void SetRank (uint8 rankId)
 
uint8 GetRank () const
 
void SetGuildIdInvited (uint32 GuildId)
 
uint32 GetGuildId () const
 
GuildGetGuild () const
 
uint32 GetGuildIdInvited ()
 
void SetInArenaTeam (uint32 ArenaTeamId, uint8 slot, uint8 type)
 
void SetArenaTeamInfoField (uint8 slot, ArenaTeamInfoType type, uint32 value)
 
uint32 GetArenaPersonalRating (uint8 slot) const
 
uint32 GetArenaTeamId (uint8 slot) const
 
void SetArenaTeamIdInvited (uint32 ArenaTeamId)
 
uint32 GetArenaTeamIdInvited ()
 
Difficulty GetDifficulty (bool isRaid) const
 
Difficulty GetDungeonDifficulty () const
 
Difficulty GetRaidDifficulty () const
 
Difficulty GetStoredRaidDifficulty () const
 
void SetDungeonDifficulty (Difficulty dungeon_difficulty)
 
void SetRaidDifficulty (Difficulty raid_difficulty)
 
void StoreRaidMapDifficulty ()
 
bool UpdateSkill (uint32 skill_id, uint32 step)
 
bool UpdateSkillPro (uint16 SkillId, int32 Chance, uint32 step)
 
bool UpdateCraftSkill (uint32 spellid)
 
bool UpdateGatherSkill (uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
 
bool UpdateFishingSkill ()
 
uint32 GetBaseDefenseSkillValue () const
 
uint32 GetBaseWeaponSkillValue (WeaponAttackType attType) const
 
uint32 GetSpellByProto (ItemTemplate *proto)
 
float GetHealthBonusFromStamina ()
 
float GetManaBonusFromIntellect ()
 
bool UpdateStats (Stats stat) override
 
bool UpdateAllStats () override
 
void ApplySpellPenetrationBonus (int32 amount, bool apply)
 
void UpdateResistances (uint32 school) override
 
void UpdateArmor () override
 
void UpdateMaxHealth () override
 
void UpdateMaxPower (Powers power) override
 
void ApplyFeralAPBonus (int32 amount, bool apply)
 
void UpdateAttackPowerAndDamage (bool ranged=false) override
 
void UpdateShieldBlockValue ()
 
void ApplySpellPowerBonus (int32 amount, bool apply)
 
void ApplySpellDamageBonus (int32 amount, bool apply)
 
void ApplySpellHealingBonus (int32 amount, bool apply)
 
void UpdateSpellDamageAndHealingBonus ()
 
void ApplyRatingMod (CombatRating cr, int32 value, bool apply)
 
void UpdateRating (CombatRating cr)
 
void UpdateAllRatings ()
 
void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
 
void UpdateDefenseBonusesMod ()
 
void RecalculateRating (CombatRating cr)
 
float GetMeleeCritFromAgility ()
 
void GetDodgeFromAgility (float &diminishing, float &nondiminishing)
 
float GetMissPercentageFromDefence () const
 
float GetSpellCritFromIntellect ()
 
float OCTRegenHPPerSpirit ()
 
float OCTRegenMPPerSpirit ()
 
float GetRatingMultiplier (CombatRating cr) const
 
float GetRatingBonusValue (CombatRating cr) const
 
uint32 GetBaseSpellPowerBonus ()
 
uint32 GetBaseSpellDamageBonus ()
 
uint32 GetBaseSpellHealingBonus ()
 
int32 GetSpellPenetrationItemMod () const
 
float GetExpertiseDodgeOrParryReduction (WeaponAttackType attType) const
 
void UpdateBlockPercentage ()
 
void UpdateCritPercentage (WeaponAttackType attType)
 
void UpdateAllCritPercentages ()
 
void UpdateParryPercentage ()
 
void UpdateDodgePercentage ()
 
void UpdateMeleeHitChances ()
 
void UpdateRangedHitChances ()
 
void UpdateSpellHitChances ()
 
void UpdateAllSpellCritChances ()
 
void UpdateSpellCritChance (uint32 school)
 
void UpdateArmorPenetration (int32 amount)
 
void UpdateExpertise (WeaponAttackType attType)
 
void ApplyManaRegenBonus (int32 amount, bool apply)
 
void ApplyHealthRegenBonus (int32 amount, bool apply)
 
void UpdateManaRegen ()
 
void UpdateEnergyRegen ()
 
void UpdateRuneRegen (RuneType rune)
 
ObjectGuid GetLootGUID () const
 
void SetLootGUID (ObjectGuid guid)
 
void RemovedInsignia (Player *looterPlr)
 
WorldSessionGetSession () const
 
void SetSession (WorldSession *sess)
 
void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target) override
 
void DestroyForPlayer (Player *target, bool onDeath=false) const override
 
void SendLogXPGain (uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
 
void SendAttackSwingCantAttack ()
 
void SendAttackSwingCancelAttack ()
 
void SendAttackSwingDeadTarget ()
 
void SendAttackSwingNotInRange ()
 
void SendAttackSwingBadFacingAttack ()
 
void SendAutoRepeatCancel (Unit *target)
 
void SendExplorationExperience (uint32 Area, uint32 Experience)
 
void SendDungeonDifficulty (bool IsInGroup)
 
void SendRaidDifficulty (bool IsInGroup, int32 forcedDifficulty=-1)
 
void SendResetInstanceSuccess (uint32 MapId)
 
void SendResetInstanceFailed (uint32 reason, uint32 MapId)
 
void SendResetFailedNotify (uint32 mapid)
 
bool UpdatePosition (float x, float y, float z, float orientation, bool teleport=false) override
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessTerrainStatusUpdate () override
 
void SendMessageToSet (WorldPacket const *data, bool self) const override
 
void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const override
 
void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const override
 
void SendTeleportAckPacket ()
 
CorpseGetCorpse () const
 
void SpawnCorpseBones (bool triggerSave=true)
 
CorpseCreateCorpse ()
 
void RemoveCorpse ()
 
void KillPlayer ()
 
bool HasCorpse () const
 
WorldLocation GetCorpseLocation () const
 
uint32 GetResurrectionSpellId ()
 
void ResurrectPlayer (float restore_percent, bool applySickness=false)
 
void BuildPlayerRepop ()
 
void RepopAtGraveyard ()
 
void SendDurabilityLoss ()
 
void DurabilityLossAll (double percent, bool inventory)
 
void DurabilityLoss (Item *item, double percent)
 
void DurabilityPointsLossAll (int32 points, bool inventory)
 
void DurabilityPointsLoss (Item *item, int32 points)
 
void DurabilityPointLossForEquipSlot (EquipmentSlots slot)
 
uint32 DurabilityRepairAll (bool cost, float discountMod, bool guildBank)
 
uint32 DurabilityRepair (uint16 pos, bool cost, float discountMod, bool guildBank)
 
void UpdateMirrorTimers ()
 
void StopMirrorTimers ()
 
bool IsMirrorTimerActive (MirrorTimerType type)
 
void SetMovement (PlayerMovementType pType)
 
bool CanJoinConstantChannelInZone (ChatChannelsEntry const *channel, AreaTableEntry const *zone)
 
void JoinedChannel (Channel *c)
 
void LeftChannel (Channel *c)
 
void CleanupChannels ()
 
void ClearChannelWatch ()
 
void UpdateLFGChannel ()
 
void UpdateLocalChannels (uint32 newZone)
 
void UpdateDefense ()
 
void UpdateWeaponSkill (Unit *victim, WeaponAttackType attType, Item *item=nullptr)
 
void UpdateCombatSkills (Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
 
void SetSkill (uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
 
uint16 GetMaxSkillValue (uint32 skill) const
 
uint16 GetPureMaxSkillValue (uint32 skill) const
 
uint16 GetSkillValue (uint32 skill) const
 
uint16 GetBaseSkillValue (uint32 skill) const
 
uint16 GetPureSkillValue (uint32 skill) const
 
int16 GetSkillPermBonusValue (uint32 skill) const
 
int16 GetSkillTempBonusValue (uint32 skill) const
 
uint16 GetSkillStep (uint16 skill) const
 
bool HasSkill (uint32 skill) const
 
void learnSkillRewardedSpells (uint32 id, uint32 value)
 
WorldLocationGetTeleportDest ()
 
bool IsBeingTeleported () const
 
bool IsBeingTeleportedNear () const
 
bool IsBeingTeleportedFar () const
 
void SetSemaphoreTeleportNear (time_t tm)
 
void SetSemaphoreTeleportFar (time_t tm)
 
time_t GetSemaphoreTeleportNear () const
 
time_t GetSemaphoreTeleportFar () const
 
void ProcessDelayedOperations ()
 
uint32 GetDelayedOperations () const
 
void ScheduleDelayedOperation (uint32 operation)
 
void CheckAreaExploreAndOutdoor ()
 
TeamId GetTeamId (bool original=false) const
 
void SetFactionForRace (uint8 race)
 
void setTeamId (TeamId teamid)
 
void InitDisplayIds ()
 
bool IsAtGroupRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtLootRewardDistance (WorldObject const *pRewardSource) const
 
bool IsAtRecruitAFriendDistance (WorldObject const *pOther) const
 
void RewardPlayerAndGroupAtKill (Unit *victim, bool isBattleGround)
 
void RewardPlayerAndGroupAtEvent (uint32 creature_id, WorldObject *pRewardSource)
 
bool isHonorOrXPTarget (Unit *victim) const
 
bool GetsRecruitAFriendBonus (bool forXP)
 
uint8 GetGrantableLevels ()
 
void SetGrantableLevels (uint8 val)
 
ReputationMgrGetReputationMgr ()
 
ReputationMgr const & GetReputationMgr () const
 
ReputationRank GetReputationRank (uint32 faction_id) const
 
void RewardReputation (Unit *victim)
 
void RewardReputation (Quest const *quest)
 
float CalculateReputationGain (ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
 
void UpdateSkillsForLevel ()
 
void UpdateSkillsToMaxSkillsForLevel ()
 
void ModifySkillBonus (uint32 skillid, int32 val, bool talent)
 
void RewardExtraBonusTalentPoints (uint32 bonusTalentPoints)
 
void UpdateHonorFields ()
 
bool RewardHonor (Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
 
uint32 GetHonorPoints () const
 
uint32 GetArenaPoints () const
 
void ModifyHonorPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 
void ModifyArenaPoints (int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
 If trans is specified, honor save query will be added to trans.
 
uint32 GetMaxPersonalArenaRatingRequirement (uint32 minarenaslot) const
 If trans is specified, arena point save query will be added to trans.
 
void SetHonorPoints (uint32 value)
 
void SetArenaPoints (uint32 value)
 
void SaveHealthBeforeDuel ()
 
void SaveManaBeforeDuel ()
 
void RestoreHealthAfterDuel ()
 
void RestoreManaAfterDuel ()
 
SpellCooldowns GetSpellCooldowns () const
 
void SetDrunkValue (uint8 newDrunkValue, uint32 itemId=0)
 
uint8 GetDrunkValue () const
 
int32 GetFakeDrunkValue () const
 
void UpdateInvisibilityDrunkDetect ()
 
uint32 GetDeathTimer () const
 
uint32 GetCorpseReclaimDelay (bool pvp) const
 
void UpdateCorpseReclaimDelay ()
 
int32 CalculateCorpseReclaimDelay (bool load=false)
 
void SendCorpseReclaimDelay (uint32 delay)
 
uint32 GetShieldBlockValue () const override
 
bool CanParry () const
 
void SetCanParry (bool value)
 
bool CanBlock () const
 
void SetCanBlock (bool value)
 
bool CanTitanGrip () const
 
void SetCanTitanGrip (bool value)
 
bool CanTameExoticPets () const
 
void SetRegularAttackTime ()
 
void SetBaseModValue (BaseModGroup modGroup, BaseModType modType, float value)
 
void HandleBaseModValue (BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
 
float GetBaseModValue (BaseModGroup modGroup, BaseModType modType) const
 
float GetTotalBaseModValue (BaseModGroup modGroup) const
 
float GetTotalPercentageModValue (BaseModGroup modGroup) const
 
void _ApplyAllStatBonuses ()
 
void _RemoveAllStatBonuses ()
 
void ResetAllPowers ()
 
void CastAllObtainSpells ()
 
void ApplyItemObtainSpells (Item *item, bool apply)
 
void UpdateItemObtainSpells (Item *item, uint8 bag, uint8 slot)
 
SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
 
void _ApplyWeaponDependentAuraMods (Item *item, WeaponAttackType attackType, bool apply)
 
void _ApplyWeaponDependentAuraCritMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyWeaponDependentAuraDamageMod (Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
 
void _ApplyItemMods (Item *item, uint8 slot, bool apply)
 
void _RemoveAllItemMods ()
 
void _ApplyAllItemMods ()
 
void _ApplyAllLevelScaleItemMods (bool apply)
 
void _ApplyItemBonuses (ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
 
void _ApplyWeaponDamage (uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
 
void _ApplyAmmoBonuses ()
 
bool EnchantmentFitsRequirements (uint32 enchantmentcondition, int8 slot)
 
void ToggleMetaGemsActive (uint8 exceptslot, bool apply)
 
void CorrectMetaGemEnchants (uint8 slot, bool apply)
 
void InitDataForForm (bool reapplyMods=false)
 
void ApplyItemEquipSpell (Item *item, bool apply, bool form_change=false)
 
void ApplyEquipSpell (SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
 
void UpdateEquipSpellsAtFormChange ()
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
 
void CastItemUseSpell (Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
 
void CastItemCombatSpell (Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item *item, ItemTemplate const *proto)
 
void SendEquipmentSetList ()
 
void SetEquipmentSet (uint32 index, EquipmentSet eqset)
 
void DeleteEquipmentSet (uint64 setGuid)
 
void SendInitWorldStates (uint32 zoneId, uint32 areaId)
 
void SendUpdateWorldState (uint32 variable, uint32 value) const
 
void SendDirectMessage (WorldPacket const *data) const
 
void SendBGWeekendWorldStates ()
 
void SendBattlefieldWorldStates ()
 
void GetAurasForTarget (Unit *target, bool force=false)
 
void SendLoot (ObjectGuid guid, LootType loot_type)
 
void SendLootError (ObjectGuid guid, LootError error)
 
void SendLootRelease (ObjectGuid guid)
 
void SendNotifyLootItemRemoved (uint8 lootSlot)
 
void SendNotifyLootMoneyRemoved ()
 
bool InBattleground () const
 
bool InArena () const
 
uint32 GetBattlegroundId () const
 
BattlegroundTypeId GetBattlegroundTypeId () const
 
uint32 GetCurrentBattlegroundQueueSlot () const
 
bool IsInvitedForBattlegroundInstance () const
 
bool IsCurrentBattlegroundRandom () const
 
BGDataGetBGData ()
 
void SetBGData (BGData &bgdata)
 
BattlegroundGetBattleground (bool create=false) const
 
bool InBattlegroundQueue (bool ignoreArena=false) const
 
bool IsDeserter () const
 
BattlegroundQueueTypeId GetBattlegroundQueueTypeId (uint32 index) const
 
uint32 GetBattlegroundQueueIndex (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool IsInvitedForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
bool InBattlegroundQueueForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId) const
 
void SetBattlegroundId (uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
 
uint32 AddBattlegroundQueueId (BattlegroundQueueTypeId val)
 
bool HasFreeBattlegroundQueueId () const
 
void RemoveBattlegroundQueueId (BattlegroundQueueTypeId val)
 
void SetInviteForBattlegroundQueueType (BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
 
bool IsInvitedForBattlegroundInstance (uint32 instanceId) const
 
TeamId GetBgTeamId () const
 
void LeaveBattleground (Battleground *bg=nullptr)
 
bool CanJoinToBattleground () const
 
bool CanReportAfkDueToLimit ()
 
void ReportedAfkBy (Player *reporter)
 This player has been blamed to be inactive in a battleground.
 
void ClearAfkReports ()
 
bool GetBGAccessByLevel (BattlegroundTypeId bgTypeId) const
 
bool CanUseBattlegroundObject (GameObject *gameobject) const
 
bool isTotalImmune () const
 
bool CanCaptureTowerPoint () const
 
bool GetRandomWinner ()
 
void SetRandomWinner (bool isWinner)
 
OutdoorPvPGetOutdoorPvP () const
 
bool IsOutdoorPvPActive ()
 
bool IsImmuneToEnvironmentalDamage ()
 
uint32 EnvironmentalDamage (EnviromentalDamage type, uint32 damage)
 
void UpdateSpeakTime (ChatFloodThrottle::Index index)
 
bool CanSpeak () const
 
void UpdateFallInformationIfNeed (MovementInfo const &minfo, uint16 opcode)
 
void SetFallInformation (uint32 time, float z)
 
void HandleFall (MovementInfo const &movementInfo)
 
bool canFlyInZone (uint32 mapid, uint32 zone, SpellInfo const *bySpell)
 
void SetClientControl (Unit *target, bool allowMove, bool packetOnly=false)
 
void SetMover (Unit *target)
 
void SetSeer (WorldObject *target)
 
WorldObjectGetSeer () const
 
void SetViewpoint (WorldObject *target, bool apply)
 
WorldObjectGetViewpoint () const
 
void StopCastingCharm (Aura *except=nullptr)
 
void StopCastingBindSight (Aura *except=nullptr)
 
uint32 GetSaveTimer () const
 
void SetSaveTimer (uint32 timer)
 
void SaveRecallPosition ()
 
void SetHomebind (WorldLocation const &loc, uint32 areaId)
 
WorldLocation GetStartPosition () const
 
WorldLocation const & GetEntryPoint () const
 
void SetEntryPoint ()
 
bool HaveAtClient (WorldObject const *u) const
 
bool HaveAtClient (ObjectGuid guid) const
 
bool IsNeverVisible () const override
 
bool IsVisibleGloballyFor (Player const *player) const
 
void GetInitialVisiblePackets (Unit *target)
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void UpdateVisibilityForPlayer (bool mapChange=false)
 
void UpdateVisibilityOf (WorldObject *target)
 
void UpdateTriggerVisibility ()
 
template<class T >
void UpdateVisibilityOf (T *target, UpdateData &data, std::vector< Unit * > &visibleNow)
 
bool HasAtLoginFlag (AtLoginFlags f) const
 
void SetAtLoginFlag (AtLoginFlags f)
 
void RemoveAtLoginFlag (AtLoginFlags flags, bool persist=false)
 
bool IsUsingLfg ()
 
bool inRandomLfgDungeon ()
 
uint32 GetTemporaryUnsummonedPetNumber () const
 
void SetTemporaryUnsummonedPetNumber (uint32 petnumber)
 
void UnsummonPetTemporaryIfAny ()
 
void ResummonPetTemporaryUnSummonedIfAny ()
 
bool IsPetNeedBeTemporaryUnsummoned () const
 
bool CanResummonPet (uint32 spellid)
 
void SendCinematicStart (uint32 CinematicSequenceId) const
 
void SendMovieStart (uint32 MovieId)
 
uint32 DoRandomRoll (uint32 minimum, uint32 maximum)
 
uint16 GetMaxSkillValueForLevel () const
 
bool IsFFAPvP ()
 
bool IsPvP ()
 
void UpdateHomebindTime (uint32 time)
 
void BindToInstance ()
 
void SetPendingBind (uint32 instanceId, uint32 bindTimer)
 
bool HasPendingBind () const
 
uint32 GetPendingBind () const
 
void SendRaidInfo ()
 
void SendSavedInstances ()
 
void PrettyPrintRequirementsQuestList (const std::vector< const ProgressionRequirement * > &missingQuests) const
 
void PrettyPrintRequirementsAchievementsList (const std::vector< const ProgressionRequirement * > &missingAchievements) const
 
void PrettyPrintRequirementsItemsList (const std::vector< const ProgressionRequirement * > &missingItems) const
 
bool Satisfy (DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
 
bool CheckInstanceLoginValid ()
 
bool CheckInstanceCount (uint32 instanceId) const
 
void AddInstanceEnterTime (uint32 instanceId, time_t enterTime)
 
uint32 GetLastPetNumber () const
 
void SetLastPetNumber (uint32 petnumber)
 
uint32 GetLastPetSpell () const
 
void SetLastPetSpell (uint32 petspell)
 
GroupGetGroupInvite ()
 
void SetGroupInvite (Group *group)
 
GroupGetGroup ()
 
const GroupGetGroup () const
 
GroupReferenceGetGroupRef ()
 
void SetGroup (Group *group, int8 subgroup=-1)
 
uint8 GetSubGroup () const
 
uint32 GetGroupUpdateFlag () const
 
void SetGroupUpdateFlag (uint32 flag)
 
uint64 GetAuraUpdateMaskForRaid () const
 
void SetAuraUpdateMaskForRaid (uint8 slot)
 
PlayerGetNextRandomRaidMember (float radius)
 
PartyResult CanUninviteFromGroup (ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
 
void SetBattlegroundOrBattlefieldRaid (Group *group, int8 subgroup=-1)
 
void RemoveFromBattlegroundOrBattlefieldRaid ()
 
GroupGetOriginalGroup ()
 
GroupReferenceGetOriginalGroupRef ()
 
uint8 GetOriginalSubGroup () const
 
void SetOriginalGroup (Group *group, int8 subgroup=-1)
 
void SetPassOnGroupLoot (bool bPassOnGroupLoot)
 
bool GetPassOnGroupLoot () const
 
MapReferenceGetMapRef ()
 
void SetMap (Map *map) override
 
void ResetMap () override
 
bool CanTeleport ()
 
void SetCanTeleport (bool value)
 
bool CanKnockback ()
 
void SetCanKnockback (bool value)
 
bool isAllowedToLoot (Creature const *creature)
 
DeclinedName const * GetDeclinedNames () const
 
uint8 GetRunesState () const
 
RuneType GetBaseRune (uint8 index) const
 
RuneType GetCurrentRune (uint8 index) const
 
uint32 GetRuneCooldown (uint8 index) const
 
uint32 GetGracePeriod (uint8 index) const
 
uint32 GetRuneBaseCooldown (uint8 index, bool skipGrace)
 
bool IsBaseRuneSlotsOnCooldown (RuneType runeType) const
 
RuneType GetLastUsedRune ()
 
void SetLastUsedRune (RuneType type)
 
void SetBaseRune (uint8 index, RuneType baseRune)
 
void SetCurrentRune (uint8 index, RuneType currentRune)
 
void SetRuneCooldown (uint8 index, uint32 cooldown)
 
void SetGracePeriod (uint8 index, uint32 period)
 
void SetRuneConvertAura (uint8 index, AuraEffect const *aura)
 
void AddRuneByAuraEffect (uint8 index, RuneType newType, AuraEffect const *aura)
 
void RemoveRunesByAuraEffect (AuraEffect const *aura)
 
void RestoreBaseRune (uint8 index)
 
void ConvertRune (uint8 index, RuneType newType)
 
void ResyncRunes (uint8 count)
 
void AddRunePower (uint8 index)
 
void InitRunes ()
 
void SendRespondInspectAchievements (Player *player) const
 
bool HasAchieved (uint32 achievementId) const
 
void ResetAchievements ()
 
void CheckAllAchievementCriteria ()
 
void ResetAchievementCriteria (AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
 
void UpdateAchievementCriteria (AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
 
void StartTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
 
void RemoveTimedAchievement (AchievementCriteriaTimedTypes type, uint32 entry)
 
void CompletedAchievement (AchievementEntry const *entry)
 
AchievementMgrGetAchievementMgr () const
 
void SetCreationTime (Seconds creationTime)
 
Seconds GetCreationTime () const
 
bool HasTitle (uint32 bitIndex) const
 
bool HasTitle (CharTitlesEntry const *title) const
 
void SetTitle (CharTitlesEntry const *title, bool lost=false)
 
void SetCurrentTitle (CharTitlesEntry const *title, bool clear=false)
 
bool CanSeeSpellClickOn (Creature const *creature) const
 
bool CanSeeVendor (Creature const *creature) const
 
uint32 GetChampioningFaction () const
 
void SetChampioningFaction (uint32 faction)
 
float GetAverageItemLevel ()
 
float GetAverageItemLevelForDF ()
 
void ClearWhisperWhiteList ()
 
void AddWhisperWhiteList (ObjectGuid guid)
 
bool IsInWhisperWhiteList (ObjectGuid guid)
 
void RemoveFromWhisperWhiteList (ObjectGuid guid)
 
bool CanFly () const override
 
bool CanEnterWater () const override
 
bool IsFreeFlying () const
 
void AdditionalSavingAddMask (uint8 mask)
 
bool IsSpectator () const
 
void SetIsSpectator (bool on)
 
bool NeedSendSpectatorData () const
 
void SetPendingSpectatorForBG (uint32 bgInstanceId)
 
bool HasPendingSpectatorForBG (uint32 bgInstanceId) const
 
void SetPendingSpectatorInviteInstanceId (uint32 bgInstanceId)
 
uint32 GetPendingSpectatorInviteInstanceId () const
 
bool HasReceivedSpectatorResetFor (ObjectGuid guid)
 
void ClearReceivedSpectatorResetFor ()
 
void AddReceivedSpectatorResetFor (ObjectGuid guid)
 
void RemoveReceivedSpectatorResetFor (ObjectGuid guid)
 
void setRuneWeaponGUID (ObjectGuid guid)
 
ObjectGuid getRuneWeaponGUID ()
 
bool CanSeeDKPet () const
 
void SetShowDKPet (bool on)
 
void PrepareCharmAISpells ()
 
bool NeedToSaveGlyphs ()
 
void SetNeedToSaveGlyphs (bool val)
 
uint32 GetMountBlockId ()
 
void SetMountBlockId (uint32 mount)
 
float GetRealParry () const
 
float GetRealDodge () const
 
const PlayerTalentMapGetTalentMap () const
 
uint32 GetNextSave () const
 
SpellModList const & GetSpellModList (uint32 type) const
 
void SetServerSideVisibility (ServerSideVisibilityType type, AccountTypes sec)
 
void SetServerSideVisibilityDetect (ServerSideVisibilityType type, AccountTypes sec)
 
void SetFarSightDistance (float radius)
 
void ResetFarSightDistance ()
 
Optional< float > GetFarSightDistance () const
 
float GetSightRange (WorldObject const *target=nullptr) const override
 
bool IsWorldObjectOutOfSightRange (WorldObject const *target) const
 
std::string GetPlayerName ()
 
PlayerSetting GetPlayerSetting (std::string const &source, uint32 index)
 
void UpdatePlayerSetting (std::string const &source, uint32 index, uint32 value)
 
void SendSystemMessage (std::string_view msg, bool escapeCharacters=false)
 
std::string GetDebugInfo () const override
 
bool IsExpectingChangeTransport () const
 
void SetExpectingChangeTransport (bool state)
 
uint32 GetPendingFlightChange () const
 
void SetPendingFlightChange (uint32 counter)
 
void SetMapChangeOrderCounter ()
 
uint32 GetMapChangeOrderCounter ()
 
const PendingSpellCastRequestGetCastRequest (uint32 category) const
 
bool CanExecutePendingSpellCastRequest (SpellInfo const *spellInfo)
 
void ExecuteOrCancelSpellCastRequest (PendingSpellCastRequest *castRequest, bool isCancel=false)
 
bool CanRequestSpellCast (SpellInfo const *spellInfo)
 
- Public Member Functions inherited from Unit
 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsCrowdControlled () const
 
bool IsImmobilizedState () const
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
bool IsClientControlled (Player const *exactClient=nullptr) const
 
Player const * GetClientControlling () const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual void SetDualWieldMode (DualWieldMode mode)
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (WeaponAttackType attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual void UpdateAllResistances ()
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void DealDamageShieldDamage (Unit *victim)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (SpellInfo const *spellInfo, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
bool IsFlying () const
 
bool IsFalling () const
 
bool IsRooted () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
void SetDisableGravity (bool disable)
 
virtual bool SetSwim (bool enable)
 
void SetCanFly (bool enable)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
void SetWaterWalking (bool enable)
 
void SetFeatherFall (bool enable)
 
void SetHover (bool enable)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
bool IsStandUpOnMovementState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object, Milliseconds timed=0ms)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg) const
 -------—Pet responses methods--------------—
 
void SendPetActionSound (PetAction action) const
 
void SendPetDismissSound () const
 
void SendPetAIReaction (ObjectGuid guid) const
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
template<typename Worker >
void DoForAllVisiblePlayers (Worker &&worker)
 
template<typename Worker >
void DoForAllVisibleWorldObjects (Worker &&worker)
 
void DestroyForVisiblePlayers ()
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
VisibilityDistanceType GetVisibilityOverrideType () const
 
bool IsVisibilityOverridden () const
 
bool IsZoneWideVisible () const
 
bool IsFarVisible () const
 
float GetVisibilityOverrideDistance () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
ObjectVisibilityContainerGetObjectVisibilityContainer ()
 
ObjectVisibilityContainer const & GetObjectVisibilityContainer () const
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
bool HasInLine (Position const *pos, float objSize, float width) const
 
std::string ToString () const
 
- Public Member Functions inherited from GridObject< Player >
bool IsInGrid () const
 
void AddToGrid (GridRefMgr< Player > &m)
 
void RemoveFromGrid ()
 

Static Public Member Functions

static bool BuildEnumData (PreparedQueryResult result, WorldPacket *data)
 
static WeaponAttackType GetAttackBySlot (uint8 slot)
 
static bool IsInventoryPos (uint16 pos)
 
static bool IsInventoryPos (uint8 bag, uint8 slot)
 
static bool IsEquipmentPos (uint16 pos)
 
static bool IsEquipmentPos (uint8 bag, uint8 slot)
 
static bool IsBagPos (uint16 pos)
 
static bool IsBankPos (uint16 pos)
 
static bool IsBankPos (uint8 bag, uint8 slot)
 
static uint32 GetDefaultGossipMenuForSource (WorldObject *source)
 
static uint32 GetZoneIdFromDB (ObjectGuid guid)
 
static bool LoadPositionFromDB (uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
 
static bool IsValidGender (uint8 Gender)
 
static void Customize (CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
 
static void SavePositionInDB (uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
 
static void SavePositionInDB (WorldLocation const &loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans)
 
static void DeleteFromDB (ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
 
static void DeleteOldCharacters ()
 
static void DeleteOldCharacters (uint32 keepDays)
 
static void DeleteOldRecoveryItems ()
 
static void DeleteOldRecoveryItems (uint32 keepDays)
 
static void RemoveFromGroup (Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
 
static void RemovePetitionsAndSigns (ObjectGuid guid, uint32 type)
 
static uint32 GetArenaTeamIdFromDB (ObjectGuid guid, uint8 slot)
 
static void LeaveAllArenaTeams (ObjectGuid guid)
 
static void ResetInstances (ObjectGuid guid, uint8 method, bool isRaid)
 Reset all solo instances and optionally send a message on success for each.
 
static void OfflineResurrect (ObjectGuid const &guid, CharacterDatabaseTransaction trans)
 
static TeamId TeamIdForRace (uint8 race)
 
static DrunkenState GetDrunkenstateByValue (uint8 value)
 
- Static Public Member Functions inherited from Unit
static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

std::string autoReplyMsg
 
PlayerTaxi m_taxi
 
time_t m_logintime
 
time_t m_Last_tick
 
uint32 m_Played_time [MAX_PLAYED_TIME_INDEX]
 
bool m_mailsUpdated
 
uint8 unReadMails
 
time_t m_nextMailDelivereTime
 
ItemMap mMitems
 
PvPInfo pvpInfo
 
std::unique_ptr< DuelInfoduel
 
PlayerMenuPlayerTalkClass
 
std::vector< ItemSetEffect * > ItemSetEff
 
SafeUnitPointer m_mover
 
WorldObjectm_seer
 
std::set< Unit * > m_isInSharedVisionOf
 
uint32 m_recallMap
 
float m_recallX
 
float m_recallY
 
float m_recallZ
 
float m_recallO
 
uint32 m_homebindMapId
 
uint16 m_homebindAreaId
 
float m_homebindX
 
float m_homebindY
 
float m_homebindZ
 
std::vector< Unit * > m_newVisible
 
uint8 m_forced_speed_changes [MAX_MOVE_TYPE]
 
DFQuestsDoneList m_DFQuests
 
uint32 m_HomebindTimer
 
bool m_InstanceValid
 
Spellm_spellModTakingSpell
 
bool isDebugAreaTriggers
 
uint32 m_pendingSpectatorForBG
 
uint32 m_pendingSpectatorInviteInstanceId
 
GuidSet m_receivedSpectatorResetFor
 
ObjectGuid m_drwGUID
 
uint32 m_charmUpdateTimer
 
std::deque< PendingSpellCastRequestSpellQueue
 
- Public Attributes inherited from Unit
uint32 m_extraAttacks
 
DualWieldMode _dualWieldMode
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ALEEventProcessor * ALEEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Static Public Attributes

static std::unordered_map< int, bgZoneRefbgZoneIdToFillWorldStates = {}
 

Protected Types

typedef std::set< uint32QuestSet
 
typedef std::set< uint32SeasonalQuestSet
 
typedef std::unordered_map< uint32, SeasonalQuestSetSeasonalEventQuestMap
 
typedef std::list< Channel * > JoinedChannelsList
 
- Protected Types inherited from Unit
typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

uint32 GetSpellQueueWindow () const
 
void ProcessSpellQueue ()
 
void _LoadActions (PreparedQueryResult result)
 
void _LoadAuras (PreparedQueryResult result, uint32 timediff)
 
void _LoadGlyphAuras ()
 
void _LoadInventory (PreparedQueryResult result, uint32 timeDiff)
 
void _LoadMail (PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
 
void _LoadQuestStatus (PreparedQueryResult result)
 
void _LoadQuestStatusRewarded (PreparedQueryResult result)
 
void _LoadDailyQuestStatus (PreparedQueryResult result)
 
void _LoadWeeklyQuestStatus (PreparedQueryResult result)
 
void _LoadMonthlyQuestStatus (PreparedQueryResult result)
 
void _LoadSeasonalQuestStatus (PreparedQueryResult result)
 
void _LoadRandomBGStatus (PreparedQueryResult result)
 
void _LoadGroup ()
 
void _LoadSkills (PreparedQueryResult result)
 
void _LoadSpells (PreparedQueryResult result)
 
void _LoadFriendList (PreparedQueryResult result)
 
bool _LoadHomeBind (PreparedQueryResult result)
 
void _LoadDeclinedNames (PreparedQueryResult result)
 
void _LoadArenaTeamInfo ()
 
void _LoadEquipmentSets (PreparedQueryResult result)
 
void _LoadEntryPointData (PreparedQueryResult result)
 
void _LoadGlyphs (PreparedQueryResult result)
 
void _LoadTalents (PreparedQueryResult result)
 
void _LoadInstanceTimeRestrictions (PreparedQueryResult result)
 
void _LoadBrewOfTheMonth (PreparedQueryResult result)
 
void _LoadCharacterSettings (PreparedQueryResult result)
 
void _LoadPetStable (uint8 petStableSlots, PreparedQueryResult result)
 
void _SaveActions (CharacterDatabaseTransaction trans)
 
void _SaveAuras (CharacterDatabaseTransaction trans, bool logout)
 
void _SaveInventory (CharacterDatabaseTransaction trans)
 
void _SaveMail (CharacterDatabaseTransaction trans)
 
void _SaveQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveDailyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveWeeklyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveMonthlyQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSeasonalQuestStatus (CharacterDatabaseTransaction trans)
 
void _SaveSpells (CharacterDatabaseTransaction trans)
 
void _SaveEquipmentSets (CharacterDatabaseTransaction trans)
 
void _SaveEntryPoint (CharacterDatabaseTransaction trans)
 
void _SaveGlyphs (CharacterDatabaseTransaction trans)
 
void _SaveTalents (CharacterDatabaseTransaction trans)
 
void _SaveStats (CharacterDatabaseTransaction trans)
 
void _SaveCharacter (bool create, CharacterDatabaseTransaction trans)
 
void _SaveInstanceTimeRestrictions (CharacterDatabaseTransaction trans)
 
void _SavePlayerSettings (CharacterDatabaseTransaction trans)
 
void HandleSobering ()
 The player sobers by 1% every 9 seconds.
 
void SendMirrorTimer (MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
 
void StopMirrorTimer (MirrorTimerType Type)
 
void HandleDrowning (uint32 time_diff)
 
int32 getMaxTimer (MirrorTimerType timer)
 
void outDebugValues () const
 
void SendQuestGiverStatusMultiple ()
 
bool CanAlwaysSee (WorldObject const *obj) const override
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
- Protected Member Functions inherited from Unit
 Unit ()
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool stun=false, bool logout=false)
 
void SendMoveRoot (bool state)
 
- Protected Member Functions inherited from WorldObject
 WorldObject ()
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Static Protected Member Functions

static Item_LoadMailedItem (ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
 

Protected Attributes

WhisperListContainer WhisperList
 
bool m_NeedToSaveGlyphs
 
uint32 m_MountBlockId
 
float m_realDodge
 
float m_realParry
 
uint32 m_charmAISpells [NUM_CAI_SPELLS]
 
uint32 m_AreaID
 
uint32 m_regenTimerCount
 
uint32 m_foodEmoteTimerCount
 
float m_powerFraction [MAX_POWERS]
 
uint32 m_contestedPvPTimer
 
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES_BgBattlegroundQueueID
 
BGData m_bgData
 
bool m_IsBGRandomWinner
 
EntryPointData m_entryPointData
 
QuestSet m_timedquests
 
QuestSet m_weeklyquests
 
QuestSet m_monthlyquests
 
SeasonalEventQuestMap m_seasonalquests
 
ObjectGuid m_divider
 
uint32 m_ingametime
 
time_t m_lastHonorUpdateTime
 
ObjectGuid m_lootGuid
 
TeamId m_team
 
uint32 m_nextSave
 
uint16 m_additionalSaveTimer
 
uint8 m_additionalSaveMask
 
uint16 m_hostileReferenceCheckTimer
 
std::array< ChatFloodThrottle, ChatFloodThrottle::MAXm_chatFloodData
 
Difficulty m_dungeonDifficulty
 
Difficulty m_raidDifficulty
 
Difficulty m_raidMapDifficulty
 
uint32 m_atLoginFlags
 
Itemm_items [PLAYER_SLOTS_COUNT]
 
uint32 m_currentBuybackSlot
 
std::vector< Item * > m_itemUpdateQueue
 
bool m_itemUpdateQueueBlocked
 
uint32 m_ExtraFlags
 
QuestStatusMap m_QuestStatus
 
QuestStatusSaveMap m_QuestStatusSave
 
RewardedQuestSet m_RewardedQuests
 
QuestStatusSaveMap m_RewardedQuestsSave
 
SkillStatusMap mSkillStatus
 
uint32 m_GuildIdInvited
 
uint32 m_ArenaTeamIdInvited
 
PlayerMails m_mail
 
PlayerSpellMap m_spells
 
PlayerTalentMap m_talents
 
uint32 m_lastPotionId
 
GlobalCooldownMgr m_GlobalCooldownMgr
 
uint8 m_activeSpec
 
uint8 m_specsCount
 
uint32 m_Glyphs [MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
 
ActionButtonList m_actionButtons
 
float m_auraBaseMod [BASEMOD_END][MOD_END]
 
int32 m_baseRatingValue [MAX_COMBAT_RATING]
 
uint32 m_baseSpellPower
 
uint32 m_baseSpellDamage
 
uint32 m_baseSpellHealing
 
uint32 m_baseFeralAP
 
uint32 m_baseManaRegen
 
uint32 m_baseHealthRegen
 
int32 m_spellPenetrationItemMod
 
SpellModList m_spellMods [MAX_SPELLMOD]
 
EnchantDurationList m_enchantDuration
 
ItemDurationList m_itemDuration
 
ItemDurationList m_itemSoulboundTradeable
 
std::mutex m_soulboundTradableLock
 
ObjectGuid m_resurrectGUID
 
uint32 m_resurrectMap
 
float m_resurrectX
 
float m_resurrectY
 
float m_resurrectZ
 
uint32 m_resurrectHealth
 
uint32 m_resurrectMana
 
WorldSessionm_session
 
JoinedChannelsList m_channels
 
uint8 m_cinematic
 
TradeDatam_trade
 
bool m_DailyQuestChanged
 
bool m_WeeklyQuestChanged
 
bool m_MonthlyQuestChanged
 
bool m_SeasonalQuestChanged
 
time_t m_lastDailyQuestTime
 
uint32 m_drunkTimer
 
uint32 m_weaponChangeTimer
 
uint32 m_zoneUpdateId
 
uint32 m_zoneUpdateTimer
 
uint32 m_areaUpdateId
 
uint32 m_deathTimer
 
time_t m_deathExpireTime
 
uint32 m_WeaponProficiency
 
uint32 m_ArmorProficiency
 
bool m_canParry
 
bool m_canBlock
 
bool m_canTitanGrip
 
uint8 m_swingErrorMsg
 
float m_ammoDPS
 
float m_Expertise
 
float m_OffhandExpertise
 
time_t _restTime
 
uint32 _innTriggerId
 
float _restBonus
 
uint32 _restFlagMask
 
uint32 m_resetTalentsCost
 
time_t m_resetTalentsTime
 
uint32 m_usedTalentCount
 
uint32 m_questRewardTalentCount
 
uint32 m_extraBonusTalentCount
 
PlayerSocialm_social
 
GroupReference m_group
 
GroupReference m_originalGroup
 
Groupm_groupInvite
 
uint32 m_groupUpdateMask
 
uint64 m_auraRaidUpdateMask
 
bool m_bPassOnGroupLoot
 
uint32 m_lastpetnumber
 
time_t m_summon_expire
 
uint32 m_summon_mapid
 
float m_summon_x
 
float m_summon_y
 
float m_summon_z
 
bool m_summon_asSpectator
 
DeclinedNamem_declinedname
 
Runesm_runes
 
EquipmentSets m_EquipmentSets
 
uint8 m_grantableLevels
 
bool m_needZoneUpdate
 
- Protected Attributes inherited from Unit
UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
VisibilityDistanceType _visibilityDistanceOverrideType
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef GuidSet RefundableItemsSet
 

Private Member Functions

bool AnyVendorOptionAvailable (uint32 menuId, Creature const *creature) const
 Checks if any vendor option is available in the gossip menu tree for a given creature.
 
InventoryResult CanStoreItem_InSpecificSlot (uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
 
InventoryResult CanStoreItem_InBag (uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
InventoryResult CanStoreItem_InInventorySlots (uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
 
Item_StoreItem (uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
 
Item_LoadItem (CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
 
void SendRefundInfo (Item *item)
 
void RefundItem (Item *item)
 
void AddKnownCurrency (uint32 itemId)
 
void AdjustQuestReqItemCount (Quest const *quest, QuestStatusData &questStatusData)
 
bool MustDelayTeleport () const
 
void SetMustDelayTeleport (bool setting)
 
bool HasDelayedTeleport () const
 
void SetHasDelayedTeleport (bool setting)
 
void UpdateCharmedAI ()
 

Private Attributes

CinematicMgr_cinematicMgr
 
RefundableItemsSet m_refundableItems
 
MapReference m_mapRef
 
uint32 m_lastFallTime
 
float m_lastFallZ
 
int32 m_MirrorTimer [MAX_TIMERS]
 
uint8 m_MirrorTimerFlags
 
uint8 m_MirrorTimerFlagsLast
 
bool m_isInWater
 
WorldLocation teleportStore_dest
 
uint32 teleportStore_options
 
time_t mSemaphoreTeleport_Near
 
time_t mSemaphoreTeleport_Far
 
uint32 m_DelayedOperations
 
bool m_bMustDelayTeleport
 
bool m_bHasDelayedTeleport
 
bool m_canTeleport
 
bool m_canKnockback
 
std::unique_ptr< PetStablem_petStable
 
uint32 m_temporaryUnsummonedPetNumber
 
uint32 m_oldpetspell
 
AchievementMgrm_achievementMgr
 
ReputationMgrm_reputationMgr
 
SpellCooldowns m_spellCooldowns
 
uint32 m_ChampioningFaction
 
InstanceTimeMap _instanceResetTimes
 
uint32 _pendingBindId
 
uint32 _pendingBindTimer
 
uint32 _activeCheats
 
uint32 healthBeforeDuel
 
uint32 manaBeforeDuel
 
bool m_isInstantFlightOn
 
uint32 m_flightSpellActivated
 
WorldLocation _corpseLocation
 
Optional< float > _farSightDistance = { }
 
bool _wasOutdoor
 
PlayerSettingMap m_charSettingsMap
 
Seconds m_creationTime
 
bool _expectingChangeTransport
 
uint32 _pendingFlightChangeCounter
 
uint32 _mapChangeOrderCounter
 

Friends

class WorldSession
 
class CinematicMgr
 
void Item::AddToUpdateQueueOf (Player *player)
 
void Item::RemoveFromUpdateQueueOf (Player *player)
 

Detailed Description

Member Typedef Documentation

◆ DFQuestsDoneList

typedef std::set<uint32> Player::DFQuestsDoneList

◆ ItemMap

typedef std::unordered_map<ObjectGuid::LowType, Item*> Player::ItemMap

◆ JoinedChannelsList

typedef std::list<Channel*> Player::JoinedChannelsList
protected

◆ QuestSet

typedef std::set<uint32> Player::QuestSet
protected

◆ RefundableItemsSet

◆ SeasonalEventQuestMap

typedef std::unordered_map<uint32, SeasonalQuestSet> Player::SeasonalEventQuestMap
protected

◆ SeasonalQuestSet

typedef std::set<uint32> Player::SeasonalQuestSet
protected

Constructor & Destructor Documentation

◆ Player()

Player::Player ( WorldSession session)
explicit
154 : Unit(), m_mover(this)
155{
156#ifdef _MSC_VER
157#pragma warning(default:4355)
158#endif
159
162
164
165 m_session = session;
166
167 m_ingametime = 0;
168
169 m_ExtraFlags = 0;
170
171 m_spellModTakingSpell = nullptr;
172 //m_pad = 0;
173
174 // players always accept
176 SetAcceptWhispers(true);
177
181
182 m_regenTimer = 0;
186
189
190 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
191
192 m_areaUpdateId = 0;
194
195 m_needZoneUpdate = false;
196
200
202
203 memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
204
205 m_social = nullptr;
206
207 // group is initialized in the reference constructor
208 SetGroupInvite(nullptr);
211 m_bPassOnGroupLoot = false;
212
215
217
220
222 m_bMustDelayTeleport = false;
223 m_bHasDelayedTeleport = false;
225 m_canTeleport = false;
226 m_canKnockback = false;
227
228 m_trade = nullptr;
229
230 m_cinematic = 0;
231
234
235 m_DailyQuestChanged = false;
237
238 for (uint8 i = 0; i < MAX_TIMERS; i++)
240
243 m_isInWater = false;
244 m_drunkTimer = 0;
245 m_deathTimer = 0;
247
249
250 m_swingErrorMsg = 0;
251
252 for (uint8 j = 0; j < PLAYER_MAX_BATTLEGROUND_QUEUES; ++j)
253 {
255 _BgBattlegroundQueueID[j].invitedToInstance = 0;
256 }
257
264 m_canParry = false;
265 m_canBlock = false;
266 m_canTitanGrip = false;
267 m_ammoDPS = 0.0f;
268
270 //cache for UNIT_CREATED_BY_SPELL to allow
271 //returning reagents for temporarily removed pets
272 //when dying/logging out
273 m_oldpetspell = 0;
274 m_lastpetnumber = 0;
275
277 _restTime = 0;
278 _innTriggerId = 0;
279 _restBonus = 0;
280 _restFlagMask = 0;
282
283 m_mailsUpdated = false;
284 unReadMails = 0;
285 m_nextMailDelivereTime = time_t(0);
286
290
291 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
293
295
296 m_HomebindTimer = 0;
297 m_InstanceValid = true;
301
302 m_lastPotionId = 0;
303
304 m_activeSpec = 0;
305 m_specsCount = 1;
306
307 for (uint8 i = 0; i < MAX_TALENT_SPECS; ++i)
308 {
309 for (uint8 g = 0; g < MAX_GLYPH_SLOT_INDEX; ++g)
310 m_Glyphs[i][g] = 0;
311 }
312
313 for (uint8 i = 0; i < BASEMOD_END; ++i)
314 {
315 m_auraBaseMod[i][FLAT_MOD] = 0.0f;
316 m_auraBaseMod[i][PCT_MOD] = 1.0f;
317 }
318
319 for (uint8 i = 0; i < MAX_COMBAT_RATING; i++)
320 m_baseRatingValue[i] = 0;
321
325 m_baseFeralAP = 0;
326 m_baseManaRegen = 0;
329
330 // Honor System
332
333 m_IsBGRandomWinner = false;
334
335 // Player summoning
336 m_summon_expire = 0;
337 m_summon_mapid = 0;
338 m_summon_x = 0.0f;
339 m_summon_y = 0.0f;
340 m_summon_z = 0.0f;
341 m_summon_asSpectator = false;
342
343 //m_mover = this;
345 m_seer = this;
346
347 m_recallMap = 0;
348 m_recallX = 0;
349 m_recallY = 0;
350 m_recallZ = 0;
351 m_recallO = 0;
352
353 m_homebindMapId = 0;
355 m_homebindX = 0;
356 m_homebindY = 0;
357 m_homebindZ = 0;
358
360
361 m_declinedname = nullptr;
362
363 m_isActive = true;
364
365 m_runes = nullptr;
366
367 m_lastFallTime = 0;
368 m_lastFallZ = 0;
369
371
373
374 sWorldSessionMgr->IncreasePlayerCount();
375
377
378 for (uint8 i = 0; i < MAX_POWERS; ++i)
379 m_powerFraction[i] = 0;
380
381 isDebugAreaTriggers = false;
382
383 m_WeeklyQuestChanged = false;
384
385 m_MonthlyQuestChanged = false;
386
388
389 SetPendingBind(0, 0);
390
392
393 m_creationTime = 0s;
394
395 _cinematicMgr = new CinematicMgr(this);
396
398 m_reputationMgr = new ReputationMgr(this);
399
400 m_NeedToSaveGlyphs = false;
401 m_MountBlockId = 0;
402 m_realDodge = 0.0f;
403 m_realParry = 0.0f;
406
408
409 for( int i = 0; i < NUM_CAI_SPELLS; ++i )
410 m_charmAISpells[i] = 0;
411
412 m_applyResilience = true;
413
414 m_isInstantFlightOn = true;
415
416 _wasOutdoor = true;
417
419
420 sScriptMgr->OnConstructPlayer(this);
421
423}
@ RAID_DIFFICULTY_10MAN_NORMAL
Definition DBCEnums.h:273
@ DUNGEON_DIFFICULTY_NORMAL
Definition DBCEnums.h:269
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
@ TYPEID_PLAYER
Definition ObjectGuid.h:36
@ TYPEMASK_PLAYER
Definition ObjectGuid.h:50
@ NUM_CAI_SPELLS
Definition Player.h:920
@ CHEAT_NONE
Definition Player.h:993
@ BUYBACK_SLOT_START
Definition Player.h:719
#define MAX_TIMERS
Definition Player.h:572
#define DISABLED_MIRROR_TIMER
Definition Player.h:573
@ PLAYED_TIME_TOTAL
Definition Player.h:850
@ PLAYED_TIME_LEVEL
Definition Player.h:851
@ UNDERWATER_NONE
Definition Player.h:101
@ AT_LOGIN_NONE
Definition Player.h:594
@ PLAYER_SLOTS_COUNT
Definition Player.h:662
#define sScriptMgr
Definition ScriptMgr.h:728
@ MAX_POWERS
Definition SharedDefines.h:287
#define MAX_TALENT_SPECS
Definition SharedDefines.h:686
#define MAX_GLYPH_SLOT_INDEX
Definition SharedDefines.h:687
@ BATTLEGROUND_QUEUE_NONE
Definition SharedDefines.h:3886
@ TEAM_NEUTRAL
Definition SharedDefines.h:773
#define PLAYER_MAX_BATTLEGROUND_QUEUES
Definition SharedDefines.h:176
#define MAX_MOVE_TYPE
Definition UnitDefines.h:364
@ FLAT_MOD
Definition Unit.h:191
@ PCT_MOD
Definition Unit.h:192
#define MAX_COMBAT_RATING
Definition Unit.h:246
@ BASEMOD_END
Definition Unit.h:186
@ PLAYER_END
Definition UpdateFields.h:392
@ CONFIG_INTERVAL_SAVE
Definition WorldConfig.h:167
#define sWorldSessionMgr
Definition WorldSessionMgr.h:108
Definition AchievementMgr.h:293
Definition Item.h:220
void InitForPlayer()
Definition ObjectVisibilityContainer.cpp:42
uint16 m_objectType
Definition Object.h:252
uint16 m_valuesCount
Definition Object.h:266
TypeID m_objectTypeId
Definition Object.h:254
Definition GossipDef.h:259
bool m_canParry
Definition Player.h:2885
time_t m_summon_expire
Definition Player.h:2921
bool m_needZoneUpdate
Definition Player.h:2938
uint16 m_additionalSaveTimer
Definition Player.h:2790
float m_ammoDPS
Definition Player.h:2889
uint32 m_temporaryUnsummonedPetNumber
Definition Player.h:2992
uint32 m_ChampioningFaction
Definition Player.h:3000
bool m_bHasDelayedTeleport
Definition Player.h:2985
bool m_InstanceValid
Definition Player.h:2440
time_t m_deathExpireTime
Definition Player.h:2881
ReputationMgr * m_reputationMgr
Definition Player.h:2996
float m_auraBaseMod[BASEMOD_END][MOD_END]
Definition Player.h:2834
float m_homebindZ
Definition Player.h:2378
uint32 m_lastFallTime
Definition Player.h:2969
uint32 m_lastPotionId
Definition Player.h:2823
CinematicMgr * _cinematicMgr
Definition Player.h:2948
bool m_canTeleport
Definition Player.h:2986
uint32 m_usedTalentCount
Definition Player.h:2902
friend class CinematicMgr
Definition Player.h:1073
bool m_MonthlyQuestChanged
Definition Player.h:2869
PlayerSocial * m_social
Definition Player.h:2907
uint32 m_homebindMapId
Definition Player.h:2374
Seconds m_creationTime
Definition Player.h:3024
void SetAcceptWhispers(bool on)
Definition Player.h:1160
float m_summon_z
Definition Player.h:2925
time_t m_lastHonorUpdateTime
Definition Player.h:2783
time_t _restTime
Definition Player.h:2895
SafeUnitPointer m_mover
Definition Player.h:2337
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2404
uint32 _activeCheats
Definition Player.h:3006
uint32 m_resetTalentsCost
Definition Player.h:2900
uint8 m_MirrorTimerFlags
Definition Player.h:2973
uint32 m_atLoginFlags
Definition Player.h:2798
uint32 m_ExtraFlags
Definition Player.h:2806
float m_recallX
Definition Player.h:2365
uint32 m_ingametime
Definition Player.h:2713
float m_recallO
Definition Player.h:2368
bool m_WeeklyQuestChanged
Definition Player.h:2868
uint8 unReadMails
Definition Player.h:1655
uint32 m_pendingSpectatorInviteInstanceId
Definition Player.h:2588
void SetGroupInvite(Group *group)
Definition Player.h:2471
uint32 m_DelayedOperations
Definition Player.h:2983
TradeData * m_trade
Definition Player.h:2865
float m_realParry
Definition Player.h:2669
uint32 m_nextSave
Definition Player.h:2789
uint32 m_zoneUpdateTimer
Definition Player.h:2877
bool _expectingChangeTransport
Definition Player.h:3026
bool m_mailsUpdated
Definition Player.h:1592
time_t mSemaphoreTeleport_Far
Definition Player.h:2981
float _restBonus
Definition Player.h:2897
uint32 m_foodEmoteTimerCount
Definition Player.h:2675
uint32 m_baseFeralAP
Definition Player.h:2839
float m_summon_y
Definition Player.h:2924
WorldObject * m_seer
Definition Player.h:2338
float m_summon_x
Definition Player.h:2923
uint32 m_charmAISpells[NUM_CAI_SPELLS]
Definition Player.h:2671
uint8 m_additionalSaveMask
Definition Player.h:2791
bool m_bMustDelayTeleport
Definition Player.h:2984
bool m_SeasonalQuestChanged
Definition Player.h:2870
TeamId m_team
Definition Player.h:2788
uint32 m_areaUpdateId
Definition Player.h:2878
uint8 m_specsCount
Definition Player.h:2828
uint32 m_extraBonusTalentCount
Definition Player.h:2904
WorldSession * GetSession() const
Definition Player.h:1998
float m_powerFraction[MAX_POWERS]
Definition Player.h:2676
uint32 m_oldpetspell
Definition Player.h:2993
Runes * m_runes
Definition Player.h:2929
uint32 m_currentBuybackSlot
Definition Player.h:2801
uint32 m_deathTimer
Definition Player.h:2880
uint32 m_regenTimerCount
Definition Player.h:2674
AchievementMgr * m_achievementMgr
Definition Player.h:2995
uint8 m_swingErrorMsg
Definition Player.h:2888
time_t m_nextMailDelivereTime
Definition Player.h:1656
std::array< BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES > _BgBattlegroundQueueID
Definition Player.h:2689
void clearResurrectRequestData()
Definition Player.h:1821
bool m_bPassOnGroupLoot
Definition Player.h:2915
float m_recallZ
Definition Player.h:2367
uint32 m_pendingSpectatorForBG
Definition Player.h:2587
bool m_DailyQuestChanged
Definition Player.h:2867
uint32 m_Glyphs[MAX_TALENT_SPECS][MAX_GLYPH_SLOT_INDEX]
Definition Player.h:2830
Difficulty m_dungeonDifficulty
Definition Player.h:2794
uint32 m_weaponChangeTimer
Definition Player.h:2874
uint32 m_WeaponProficiency
Definition Player.h:2883
float m_realDodge
Definition Player.h:2668
bool m_canKnockback
Definition Player.h:2987
bool m_isInstantFlightOn
Definition Player.h:3012
time_t mSemaphoreTeleport_Near
Definition Player.h:2980
DeclinedName * m_declinedname
Definition Player.h:2928
bool m_IsBGRandomWinner
Definition Player.h:2691
uint32 m_drunkTimer
Definition Player.h:2873
uint32 m_contestedPvPTimer
Definition Player.h:2677
uint32 m_baseSpellHealing
Definition Player.h:2838
float m_homebindY
Definition Player.h:2377
uint32 m_Played_time[MAX_PLAYED_TIME_INDEX]
Definition Player.h:1191
uint32 m_baseSpellPower
Definition Player.h:2836
bool _wasOutdoor
Definition Player.h:3020
void SetPendingBind(uint32 instanceId, uint32 bindTimer)
Definition Player.h:2442
uint32 _restFlagMask
Definition Player.h:2898
uint8 m_grantableLevels
Definition Player.h:2936
Item * m_items[PLAYER_SLOTS_COUNT]
Definition Player.h:2800
uint16 m_homebindAreaId
Definition Player.h:2375
Difficulty m_raidMapDifficulty
Definition Player.h:2796
uint32 m_zoneUpdateId
Definition Player.h:2876
bool m_isInWater
Definition Player.h:2975
uint8 m_MirrorTimerFlagsLast
Definition Player.h:2974
time_t m_lastDailyQuestTime
Definition Player.h:2871
time_t m_resetTalentsTime
Definition Player.h:2901
uint32 m_baseHealthRegen
Definition Player.h:2841
uint32 m_charmUpdateTimer
Definition Player.h:2599
uint32 m_summon_mapid
Definition Player.h:2922
Difficulty m_raidDifficulty
Definition Player.h:2795
float m_lastFallZ
Definition Player.h:2970
bool m_summon_asSpectator
Definition Player.h:2926
uint32 m_baseManaRegen
Definition Player.h:2840
time_t m_logintime
Definition Player.h:1189
int32 m_MirrorTimer[MAX_TIMERS]
Definition Player.h:2972
uint32 _innTriggerId
Definition Player.h:2896
uint32 m_ArenaTeamIdInvited
Definition Player.h:2818
uint32 m_recallMap
Definition Player.h:2364
uint32 m_baseSpellDamage
Definition Player.h:2837
float m_recallY
Definition Player.h:2366
uint32 m_questRewardTalentCount
Definition Player.h:2903
bool m_NeedToSaveGlyphs
Definition Player.h:2664
uint32 m_HomebindTimer
Definition Player.h:2439
uint64 m_auraRaidUpdateMask
Definition Player.h:2914
bool m_canTitanGrip
Definition Player.h:2887
bool m_canBlock
Definition Player.h:2886
uint8 m_cinematic
Definition Player.h:2863
int32 m_spellPenetrationItemMod
Definition Player.h:2842
uint8 m_activeSpec
Definition Player.h:2827
WorldSession * m_session
Definition Player.h:2858
uint32 m_flightSpellActivated
Definition Player.h:3014
uint32 teleportStore_options
Definition Player.h:2979
int32 m_baseRatingValue[MAX_COMBAT_RATING]
Definition Player.h:2835
uint32 m_ArmorProficiency
Definition Player.h:2884
bool isDebugAreaTriggers
Definition Player.h:2562
uint32 m_groupUpdateMask
Definition Player.h:2913
Spell * m_spellModTakingSpell
Definition Player.h:2558
uint32 m_lastpetnumber
Definition Player.h:2918
time_t m_Last_tick
Definition Player.h:1190
PlayerMenu * PlayerTalkClass
Definition Player.h:2243
uint32 m_GuildIdInvited
Definition Player.h:2817
float m_homebindX
Definition Player.h:2376
uint16 m_hostileReferenceCheckTimer
Definition Player.h:2792
bool m_itemUpdateQueueBlocked
Definition Player.h:2804
uint32 m_MountBlockId
Definition Player.h:2666
Definition ReputationMgr.h:57
void Initialize(Unit *defVal)
Definition UnitUtils.h:51
int32 m_regenTimer
Definition Unit.h:2148
bool m_ControlledByPlayer
Definition Unit.h:2057
Unit()
Definition Unit.cpp:206
SafeUnitPointer m_movedByPlayer
Definition Unit.h:2034
bool m_applyResilience
Definition Unit.h:2161
bool m_isActive
Definition Object.h:735
ObjectVisibilityContainer & GetObjectVisibilityContainer()
Definition Object.h:726
#define sWorld
Definition World.h:316
bool IsPlayerAccount(uint32 gmlevel)
Definition AccountMgr.cpp:312
uint32 GetSecurity(uint32 accountId)
Definition AccountMgr.cpp:245
Seconds GetGameTime()
Definition GameTime.cpp:38

References _activeCheats, _BgBattlegroundQueueID, _cinematicMgr, _expectingChangeTransport, _innTriggerId, _restBonus, _restFlagMask, _restTime, _wasOutdoor, AT_LOGIN_NONE, BASEMOD_END, BATTLEGROUND_QUEUE_NONE, BUYBACK_SLOT_START, CHEAT_NONE, CinematicMgr, clearResurrectRequestData(), CONFIG_INTERVAL_SAVE, DISABLED_MIRROR_TIMER, DUNGEON_DIFFICULTY_NORMAL, FLAT_MOD, GameTime::GetGameTime(), WorldObject::GetObjectVisibilityContainer(), GetSession(), ObjectVisibilityContainer::InitForPlayer(), SafeUnitPointer::Initialize(), isDebugAreaTriggers, AccountMgr::IsPlayerAccount(), m_achievementMgr, m_activeSpec, m_additionalSaveMask, m_additionalSaveTimer, m_ammoDPS, Unit::m_applyResilience, m_areaUpdateId, m_ArenaTeamIdInvited, m_ArmorProficiency, m_atLoginFlags, m_auraBaseMod, m_auraRaidUpdateMask, m_baseFeralAP, m_baseHealthRegen, m_baseManaRegen, m_baseRatingValue, m_baseSpellDamage, m_baseSpellHealing, m_baseSpellPower, m_bHasDelayedTeleport, m_bMustDelayTeleport, m_bPassOnGroupLoot, m_canBlock, m_canKnockback, m_canParry, m_canTeleport, m_canTitanGrip, m_ChampioningFaction, m_charmAISpells, m_charmUpdateTimer, m_cinematic, m_contestedPvPTimer, Unit::m_ControlledByPlayer, m_creationTime, m_currentBuybackSlot, m_DailyQuestChanged, m_deathExpireTime, m_deathTimer, m_declinedname, m_DelayedOperations, m_drunkTimer, m_dungeonDifficulty, m_extraBonusTalentCount, m_ExtraFlags, m_flightSpellActivated, m_foodEmoteTimerCount, m_forced_speed_changes, m_Glyphs, m_grantableLevels, m_groupUpdateMask, m_GuildIdInvited, m_homebindAreaId, m_homebindMapId, m_HomebindTimer, m_homebindX, m_homebindY, m_homebindZ, m_hostileReferenceCheckTimer, m_ingametime, m_InstanceValid, WorldObject::m_isActive, m_IsBGRandomWinner, m_isInstantFlightOn, m_isInWater, m_items, m_itemUpdateQueueBlocked, m_Last_tick, m_lastDailyQuestTime, m_lastFallTime, m_lastFallZ, m_lastHonorUpdateTime, m_lastpetnumber, m_lastPotionId, m_logintime, m_mailsUpdated, m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, m_MonthlyQuestChanged, m_MountBlockId, Unit::m_movedByPlayer, m_NeedToSaveGlyphs, m_needZoneUpdate, m_nextMailDelivereTime, m_nextSave, Object::m_objectType, Object::m_objectTypeId, m_oldpetspell, m_pendingSpectatorForBG, m_pendingSpectatorInviteInstanceId, m_Played_time, m_powerFraction, m_questRewardTalentCount, m_raidDifficulty, m_raidMapDifficulty, m_realDodge, m_realParry, m_recallMap, m_recallO, m_recallX, m_recallY, m_recallZ, Unit::m_regenTimer, m_regenTimerCount, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_runes, m_SeasonalQuestChanged, m_seer, m_session, m_social, m_specsCount, m_spellModTakingSpell, m_spellPenetrationItemMod, m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, m_swingErrorMsg, m_team, m_temporaryUnsummonedPetNumber, m_trade, m_usedTalentCount, Object::m_valuesCount, m_weaponChangeTimer, m_WeaponProficiency, m_WeeklyQuestChanged, m_zoneUpdateId, m_zoneUpdateTimer, MAX_COMBAT_RATING, MAX_GLYPH_SLOT_INDEX, MAX_MOVE_TYPE, MAX_POWERS, MAX_TALENT_SPECS, MAX_TIMERS, mSemaphoreTeleport_Far, mSemaphoreTeleport_Near, NUM_CAI_SPELLS, PCT_MOD, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_END, PLAYER_MAX_BATTLEGROUND_QUEUES, PLAYER_SLOTS_COUNT, PlayerTalkClass, RAID_DIFFICULTY_10MAN_NORMAL, SetAcceptWhispers(), SetGroupInvite(), SetPendingBind(), sScriptMgr, sWorld, sWorldSessionMgr, TEAM_NEUTRAL, teleportStore_options, TYPEID_PLAYER, TYPEMASK_PLAYER, UNDERWATER_NONE, and unReadMails.

◆ ~Player()

Player::~Player ( )
override
426{
427 sScriptMgr->OnDestructPlayer(this);
428
429 // it must be unloaded already in PlayerLogout and accessed only for loggined player
430 //m_social = nullptr;
431
432 // Note: buy back item already deleted from DB when player was saved
433 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; ++i)
434 delete m_items[i];
435
436 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
437 delete itr->second;
438
439 for (PlayerTalentMap::const_iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
440 delete itr->second;
441
442 //all mailed items should be deleted, also all mail should be deallocated
443 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
444 {
445 delete *itr;
446 }
447
448 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
449 delete iter->second; //if item is duplicated... then server may crash ... but that item should be deallocated
450
451 delete PlayerTalkClass;
452
453 for (std::size_t x = 0; x < ItemSetEff.size(); x++)
454 delete ItemSetEff[x];
455
456 delete m_declinedname;
457 delete m_runes;
458 delete m_achievementMgr;
459 delete m_reputationMgr;
460 delete _cinematicMgr;
461
462 sWorldSessionMgr->DecreasePlayerCount();
463
464 if (!m_isInSharedVisionOf.empty())
465 {
466 do
467 {
468 Unit* u = *(m_isInSharedVisionOf.begin());
469 u->RemovePlayerFromVision(this);
470 } while (!m_isInSharedVisionOf.empty());
471 }
472}
ItemMap mMitems
Definition Player.h:1660
PlayerSpellMap m_spells
Definition Player.h:2821
std::vector< ItemSetEffect * > ItemSetEff
Definition Player.h:2244
PlayerMails m_mail
Definition Player.h:2820
PlayerTalentMap m_talents
Definition Player.h:2822
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2339
Definition Unit.h:650
void RemovePlayerFromVision(Player *player)
Definition Unit.cpp:11259

References _cinematicMgr, ItemSetEff, m_achievementMgr, m_declinedname, m_isInSharedVisionOf, m_items, m_mail, m_reputationMgr, m_runes, m_spells, m_talents, mMitems, PLAYER_SLOTS_COUNT, PlayerTalkClass, Unit::RemovePlayerFromVision(), sScriptMgr, and sWorldSessionMgr.

Member Function Documentation

◆ _addSpell()

bool Player::_addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  temporary,
bool  learnFromSkill = false 
)
Todo:
confirm if rogues start wth lockpicking skill at level 1 but only recieve the spell to use it at level 16
3126{
3127 // pussywizard: this can be called to OVERWRITE currently existing spell params! usually to set active = false for lower ranks of a spell
3128
3129 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3130 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, false))
3131 return false;
3132
3133 // pussywizard: already found and temporary, nothing to do
3134 PlayerSpellMap::iterator itr = m_spells.find(spellId);
3135 if (itr != m_spells.end() && itr->second->State == PLAYERSPELL_TEMPORARY)
3136 return false;
3137
3138 // xinef: send packet so client can properly recognize this new spell
3139 // xinef: ignore passive spells and spells with learn effect
3140 // xinef: send spells with no aura effects (ie dual wield)
3141 if (IsInWorld() && !isBeingLoaded() && temporary && !learnFromSkill && (!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3142 SendLearnPacket(spellInfo->Id, true);
3143
3144 // xinef: DO NOT allow to learn spell with effect learn spell!
3145 // xinef: if spell possess spell learn effects only, learn those spells as temporary (eg. Metamorphosis, Tree of Life)
3146 if (temporary && spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3147 {
3148 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3149 if (spellInfo->Effects[i].IsEffect())
3150 {
3151 if (spellInfo->Effects[i].Effect != SPELL_EFFECT_LEARN_SPELL)
3152 {
3153 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN: {}, PLAYER: {}", spellId, GetGUID().ToString());
3154 return false;
3155 //ABORT();
3156 }
3157 else if (SpellInfo const* learnSpell = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
3159 }
3160
3161 return false;
3162 }
3163
3164 if (itr != m_spells.end()) // pussywizard: already know this spell, so update information
3165 {
3166 // pussywizard: do nothing if already set as wanted
3167 if (itr->second->State != PLAYERSPELL_REMOVED && (itr->second->specMask & addSpecMask) == addSpecMask)
3168 return false;
3169
3170 // pussywizard: need cast auras, learn linked spells, do professions stuff, etc.
3171 // pussywizard: but only for spells that are really added (inactive -> active OR added to current spec)
3172 bool spellIsNew = true;
3173
3174 // pussywizard: present in m_spells, not removed, already in current spec, already active
3175 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec))
3176 spellIsNew = false;
3177
3178 // pussywizard: update info in m_spells
3179 if (itr->second->State != PLAYERSPELL_NEW && (itr->second->specMask & addSpecMask) != addSpecMask)
3180 itr->second->State = PLAYERSPELL_CHANGED;
3181 itr->second->Active = true;
3182 itr->second->specMask |= addSpecMask;
3183
3184 if (!spellIsNew)
3185 return true;
3186 }
3187 else // pussywizard: not found in m_spells
3188 {
3189 PlayerSpell* newspell = new PlayerSpell;
3190 newspell->Active = true;
3192 newspell->specMask = addSpecMask;
3193
3194 m_spells[spellId] = newspell;
3195 }
3196
3197 // pussywizard: return if spell not in current spec
3198 // pussywizard: return true to fix active for ranks, this condition is true only at loading, so no problems with learning packets
3199 if (!((1 << GetActiveSpec()) & addSpecMask))
3200 return true;
3201
3202 // xinef: do not add spells with effect learn spell
3203 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3204 {
3205 LOG_INFO("entities.player", "TRYING TO LEARN SPELL WITH EFFECT LEARN 2: {}, PLAYER: {}", spellId, GetGUID().ToString());
3206 m_spells.erase(spellInfo->Id); // mem leak, but should never happen
3207 return false;
3208 //ABORT();
3209 }
3210 // pussywizard: cast passive spells (including all talents without SPELL_EFFECT_LEARN_SPELL) with additional checks
3211 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3212 {
3213 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3214 CastSpell(this, spellId, true);
3215 }
3216 // pussywizard: cast and return, learnt spells will update profession count, etc.
3217 else if (spellInfo->HasEffect(SPELL_EFFECT_SKILL_STEP))
3218 {
3219 CastSpell(this, spellId, true);
3220 return false;
3221 }
3222
3223 // xinef: unapply aura stats if dont meet requirements
3224 // xinef: handle only if player is not loaded, loading is handled in loadfromdb
3225 if (!isBeingLoaded())
3226 if (Aura* aura = GetAura(spellId))
3227 {
3228 if (aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_35_PERCENT ||
3229 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTH_ABOVE_75_PERCENT ||
3230 aura->GetSpellInfo()->CasterAuraState == AURA_STATE_HEALTHLESS_20_PERCENT )
3231 if (!HasAuraState((AuraStateType)aura->GetSpellInfo()->CasterAuraState))
3232 aura->HandleAllEffects(aura->GetApplicationOfTarget(GetGUID()), AURA_EFFECT_HANDLE_REAL, false);
3233 }
3234
3235 // pussywizard: update free primary prof points
3236 if (uint32 freeProfs = GetFreePrimaryProfessionPoints())
3237 {
3238 if (spellInfo->IsPrimaryProfessionFirstRank())
3239 SetFreePrimaryProfessions(freeProfs - 1);
3240 }
3241
3242 uint16 maxskill = GetMaxSkillValueForLevel();
3243 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spellId);
3244 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3245 // xinef: set appropriate skill value
3246 if (spellLearnSkill)
3247 {
3248 uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill);
3249 uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill);
3250 uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? maxskill : spellLearnSkill->maxvalue;
3251
3252 if (skill_value < spellLearnSkill->value)
3253 skill_value = spellLearnSkill->value;
3254 if (skill_max_value < new_skill_max_value)
3255 skill_max_value = new_skill_max_value;
3256
3257 SetSkill(spellLearnSkill->skill, spellLearnSkill->step, skill_value, skill_max_value);
3258 }
3259 else
3260 {
3261 // not ranked skills
3262 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3263 {
3264 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3265 if (!pSkill)
3266 continue;
3267
3269 // Added for runeforging, it is confirmed via sniff that this happens when death knights learn the spell, not on character creation.
3270 if ((_spell_idx->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && !HasSkill(pSkill->id)) || ((pSkill->id == SKILL_LOCKPICKING || pSkill->id == SKILL_RUNEFORGING) && _spell_idx->second->TrivialSkillLineRankHigh == 0))
3271 LearnDefaultSkill(pSkill->id, 0);
3272
3273 if (pSkill->id == SKILL_MOUNTS && !Has310Flyer(false))
3274 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3275 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3276 SetHas310Flyer(true);
3277 }
3278 }
3279
3280 // xinef: update achievement criteria
3281 if (!GetSession()->PlayerLoading())
3282 {
3283 for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
3284 {
3287 }
3289 }
3290
3291 return true;
3292}
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN
Definition DBCEnums.h:361
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL
Definition DBCEnums.h:148
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS
Definition DBCEnums.h:185
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE
Definition DBCEnums.h:218
DBCStorage< SkillLineEntry > sSkillLineStore(SkillLinefmt)
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1638
std::uint16_t uint16
Definition Define.h:108
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define SPEC_MASK_ALL
Definition Player.h:178
@ PLAYERSPELL_REMOVED
Definition Player.h:123
@ PLAYERSPELL_UNCHANGED
Definition Player.h:120
@ PLAYERSPELL_CHANGED
Definition Player.h:121
@ PLAYERSPELL_NEW
Definition Player.h:122
@ PLAYERSPELL_TEMPORARY
Definition Player.h:124
@ SPELL_EFFECT_LEARN_SPELL
Definition SharedDefines.h:825
@ SPELL_EFFECT_SKILL_STEP
Definition SharedDefines.h:833
SpellAttr0
Definition SharedDefines.h:392
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:399
@ SPELL_ATTR0_DO_NOT_DISPLAY
Definition SharedDefines.h:400
AuraStateType
Definition SharedDefines.h:1299
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1316
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1326
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1304
@ SKILL_RUNEFORGING
Definition SharedDefines.h:3254
@ SKILL_LOCKPICKING
Definition SharedDefines.h:3225
@ SKILL_MOUNTS
Definition SharedDefines.h:3255
@ SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED
Definition SpellAuraDefines.h:270
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
#define sSpellMgr
Definition SpellMgr.h:825
std::pair< SkillLineAbilityMap::const_iterator, SkillLineAbilityMap::const_iterator > SkillLineAbilityMapBounds
Definition SpellMgr.h:584
Definition SpellAuras.h:87
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2160
bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill=false)
Definition Player.cpp:3125
void learnSpell(uint32 spellId, bool temporary=false, bool learnFromSkill=false)
Definition Player.cpp:3303
void LearnDefaultSkill(uint32 skillId, uint16 rank)
Definition Player.cpp:11927
bool isBeingLoaded() const override
Definition PlayerStorage.cpp:4919
void SendLearnPacket(uint32 spellId, bool learn)
Definition Player.cpp:3032
uint16 GetMaxSkillValueForLevel() const
Definition Player.cpp:16253
bool IsNeedCastPassiveSpellAtLearn(SpellInfo const *spellInfo) const
Definition Player.cpp:3294
uint16 GetPureSkillValue(uint32 skill) const
Definition Player.cpp:5534
bool HasSkill(uint32 skill) const
Definition Player.cpp:5448
uint16 GetPureMaxSkillValue(uint32 skill) const
Definition Player.cpp:5504
void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal)
Definition Player.cpp:5348
bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId=0)
Definition Player.cpp:3497
uint8 GetActiveSpec() const
Definition Player.h:1736
void SetHas310Flyer(bool on)
Definition Player.h:1173
void SetFreePrimaryProfessions(uint16 profs)
Definition Player.h:1765
uint32 GetFreePrimaryProfessionPoints() const
Definition Player.h:1764
Definition SpellInfo.h:316
uint32 Stances
Definition SpellInfo.h:333
bool IsPassive() const
Definition SpellInfo.cpp:1098
uint32 Id
Definition SpellInfo.h:320
bool HasAnyAura() const
Definition SpellInfo.cpp:901
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
bool IsPrimaryProfessionFirstRank() const
Definition SpellInfo.cpp:983
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
static bool CheckSpellValid(SpellInfo const *spellInfo, uint32 spellId, bool isTalent)
Definition SpellMgr.cpp:459
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5649
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10623
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1194
bool PlayerLoading() const
Definition WorldSession.h:381
Definition Player.h:128
PlayerSpellState State
Definition Player.h:129
bool Active
Definition Player.h:130
uint8 specMask
Definition Player.h:131
std::string ToString() const
Definition Position.cpp:59
Definition DBCStructure.h:1584
uint32 id
Definition DBCStructure.h:1585
Definition SpellMgr.h:574
uint16 value
Definition SpellMgr.h:577
uint16 step
Definition SpellMgr.h:576
uint16 maxvalue
Definition SpellMgr.h:578
uint16 skill
Definition SpellMgr.h:575

References _addSpell(), ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, PlayerSpell::Active, AURA_EFFECT_HANDLE_REAL, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Unit::CastSpell(), SpellMgr::CheckSpellValid(), SpellInfo::Effects, GetActiveSpec(), Unit::GetAura(), GetFreePrimaryProfessionPoints(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetSession(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), Unit::HasAuraState(), SpellInfo::HasEffect(), HasSkill(), SpellInfo::Id, SkillLineEntry::id, isBeingLoaded(), Object::IsInWorld(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), SpellInfo::IsPrimaryProfessionFirstRank(), LearnDefaultSkill(), learnSpell(), LOG_INFO, m_activeSpec, m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, WorldSession::PlayerLoading(), PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, SendLearnPacket(), SetFreePrimaryProfessions(), SetHas310Flyer(), SetSkill(), SpellLearnSkillNode::skill, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LOCKPICKING, SKILL_MOUNTS, SKILL_RUNEFORGING, SPEC_MASK_ALL, PlayerSpell::specMask, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_SKILL_STEP, sSkillLineStore, sSpellMgr, SpellInfo::Stances, PlayerSpell::State, SpellLearnSkillNode::step, Position::ToString(), UpdateAchievementCriteria(), and SpellLearnSkillNode::value.

Referenced by _addSpell(), _addTalentAurasAndSpells(), addSpell(), AuraEffect::HandleAuraModShapeshift(), and AuraEffect::HandleAuraOverrideSpells().

◆ _AddSpellCooldown()

void Player::_AddSpellCooldown ( uint32  spell_id,
uint16  categoryId,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
11086{
11087 SpellCooldown sc;
11088 sc.end = GameTime::GetGameTimeMS().count() + end_time;
11089 sc.category = categoryId;
11090 sc.itemid = itemid;
11091 sc.maxduration = end_time;
11092 sc.sendToSpectator = false;
11093 sc.needSendToClient = needSendToClient;
11094
11096 {
11097 if (NeedSendSpectatorData() && forceSendToSpectator && (itemid || HasActiveSpell(spellid)))
11098 {
11099 sc.sendToSpectator = true;
11100 ArenaSpectator::SendCommand_Cooldown(FindMap(), GetGUID(), "ACD", spellid, end_time / IN_MILLISECONDS, end_time / IN_MILLISECONDS);
11101 }
11102 }
11103
11104 m_spellCooldowns[spellid] = std::move(sc);
11105}
#define SPECTATOR_COOLDOWN_MAX
Definition ArenaSpectator.h:37
#define SPECTATOR_COOLDOWN_MIN
Definition ArenaSpectator.h:36
constexpr auto IN_MILLISECONDS
Definition Common.h:53
bool NeedSendSpectatorData() const
Definition Player.cpp:15518
bool HasActiveSpell(uint32 spell) const
Definition Player.cpp:3903
SpellCooldowns m_spellCooldowns
Definition Player.h:2998
Map * FindMap() const
Definition Object.h:622
void SendCommand_Cooldown(T *o, ObjectGuid targetGUID, const char *prefix, uint32 id, uint32 dur, uint32 maxdur)
Definition ArenaSpectator.h:89
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43
Definition Player.h:201
uint32 itemid
Definition Player.h:204
bool sendToSpectator
Definition Player.h:206
bool needSendToClient
Definition Player.h:207
uint32 end
Definition Player.h:202
uint32 maxduration
Definition Player.h:205
uint16 category
Definition Player.h:203

References SpellCooldown::category, SpellCooldown::end, WorldObject::FindMap(), GameTime::GetGameTimeMS(), Object::GetGUID(), HasActiveSpell(), IN_MILLISECONDS, SpellCooldown::itemid, m_spellCooldowns, SpellCooldown::maxduration, NeedSendSpectatorData(), SpellCooldown::needSendToClient, ArenaSpectator::SendCommand_Cooldown(), SpellCooldown::sendToSpectator, SPECTATOR_COOLDOWN_MAX, and SPECTATOR_COOLDOWN_MIN.

Referenced by _LoadSpellCooldowns(), AddSpellAndCategoryCooldowns(), and AddSpellCooldown().

◆ _addTalentAurasAndSpells()

void Player::_addTalentAurasAndSpells ( uint32  spellId)
3016{
3017 // pussywizard: spells learnt from talents are added as TEMPORARY, so not saved to db (only the talent itself is saved)
3018 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
3019 if (spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3020 {
3021 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3022 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && !sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3023 _addSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3024 }
3025 else if (spellInfo->IsPassive() || (spellInfo->HasAttribute(SPELL_ATTR0_DO_NOT_DISPLAY) && spellInfo->Stances))
3026 {
3027 if (IsNeedCastPassiveSpellAtLearn(spellInfo))
3028 CastSpell(this, spellId, true);
3029 }
3030}

References _addSpell(), Unit::CastSpell(), SpellInfo::Effects, SpellInfo::HasAttribute(), SpellInfo::HasEffect(), IsNeedCastPassiveSpellAtLearn(), SpellInfo::IsPassive(), MAX_SPELL_EFFECTS, SPEC_MASK_ALL, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, and SpellInfo::Stances.

Referenced by ActivateSpec(), and addTalent().

◆ _ApplyAllItemMods()

void Player::_ApplyAllItemMods ( )
7618{
7619 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods start.");
7620
7621 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7622 {
7623 if (m_items[i])
7624 {
7625 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7626 continue;
7627
7628 ItemTemplate const* proto = m_items[i]->GetTemplate();
7629 if (!proto)
7630 continue;
7631
7633 if (attacktype < MAX_ATTACK)
7634 _ApplyWeaponDependentAuraMods(m_items[i], attacktype, true);
7635
7636 _ApplyItemBonuses(proto, i, true);
7637
7638 if (i == EQUIPMENT_SLOT_RANGED)
7640 }
7641 }
7642
7643 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7644 {
7645 if (m_items[i])
7646 {
7647 ItemTemplate const* proto = m_items[i]->GetTemplate();
7648 if (!proto)
7649 continue;
7650
7651 // item set bonuses not dependent from item broken state
7652 if (proto->ItemSet)
7653 AddItemsSetItem(this, m_items[i]);
7654
7655 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7656 continue;
7657
7658 ApplyItemEquipSpell(m_items[i], true);
7659 ApplyEnchantment(m_items[i], true);
7660 }
7661 }
7662
7663 LOG_DEBUG("entities.player.items", "_ApplyAllItemMods complete.");
7664}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
void AddItemsSetItem(Player *player, Item *item)
Definition Item.cpp:32
@ INVENTORY_SLOT_BAG_END
Definition Player.h:695
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:687
WeaponAttackType
Definition Unit.h:210
@ MAX_ATTACK
Definition Unit.h:214
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
void _ApplyAmmoBonuses()
Definition Player.cpp:7684
void ApplyItemEquipSpell(Item *item, bool apply, bool form_change=false)
Definition Player.cpp:7175
void ApplyEnchantment(Item *item, EnchantmentSlot slot, bool apply, bool apply_dur=true, bool ignore_condition=false)
Definition PlayerStorage.cpp:4303
void _ApplyItemBonuses(ItemTemplate const *proto, uint8 slot, bool apply, bool only_level_scale=false)
Definition Player.cpp:6618
void _ApplyWeaponDependentAuraMods(Item *item, WeaponAttackType attackType, bool apply)
Definition Player.cpp:7071
static WeaponAttackType GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:543
bool CanUseAttackType(WeaponAttackType attacktype) const
Definition Unit.h:970
Definition ItemTemplate.h:619
uint32 ItemSet
Definition ItemTemplate.h:675

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), AddItemsSetItem(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, and MAX_ATTACK.

Referenced by _ApplyAllStatBonuses(), and _LoadInventory().

◆ _ApplyAllLevelScaleItemMods()

void Player::_ApplyAllLevelScaleItemMods ( bool  apply)
7667{
7668 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7669 {
7670 if (m_items[i])
7671 {
7672 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7673 continue;
7674
7675 ItemTemplate const* proto = m_items[i]->GetTemplate();
7676 if (!proto)
7677 continue;
7678
7679 _ApplyItemMods(m_items[i], i, apply);
7680 }
7681 }
7682}
void _ApplyItemMods(Item *item, uint8 slot, bool apply)
Definition Player.cpp:6583

References _ApplyItemMods(), Unit::CanUseAttackType(), GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, and m_items.

Referenced by GiveLevel(), and reset_commandscript::HandleResetLevelCommand().

◆ _ApplyAllStatBonuses()

void Player::_ApplyAllStatBonuses ( )
1009{
1010 SetCanModifyStats(false);
1011
1014
1015 SetCanModifyStats(true);
1016
1018}
void _ApplyAllItemMods()
Definition Player.cpp:7617
bool UpdateAllStats() override
Definition StatSystem.cpp:205
void _ApplyAllAuraStatMods()
Definition Unit.cpp:5556
void SetCanModifyStats(bool modifyStats)
Definition Unit.h:1058

References Unit::_ApplyAllAuraStatMods(), _ApplyAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _ApplyAmmoBonuses()

void Player::_ApplyAmmoBonuses ( )
7685{
7686 // check ammo
7688 if (!ammo_id)
7689 return;
7690
7691 float currentAmmoDPS;
7692
7693 ItemTemplate const* ammo_proto = sObjectMgr->GetItemTemplate(ammo_id);
7694 if (!ammo_proto || ammo_proto->Class != ITEM_CLASS_PROJECTILE || !CheckAmmoCompatibility(ammo_proto))
7695 currentAmmoDPS = 0.0f;
7696 else
7697 currentAmmoDPS = (ammo_proto->Damage[0].DamageMin + ammo_proto->Damage[0].DamageMax) / 2;
7698
7699 sScriptMgr->OnPlayerApplyAmmoBonuses(this, ammo_proto, currentAmmoDPS);
7700
7701 if (currentAmmoDPS == GetAmmoDPS())
7702 return;
7703
7704 m_ammoDPS = currentAmmoDPS;
7705
7706 if (CanModifyStats())
7708}
@ ITEM_CLASS_PROJECTILE
Definition ItemTemplate.h:297
#define sObjectMgr
Definition ObjectMgr.h:1650
@ RANGED_ATTACK
Definition Unit.h:213
@ PLAYER_AMMO_ID
Definition UpdateFields.h:369
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:294
bool CheckAmmoCompatibility(ItemTemplate const *ammo_proto) const
Definition Player.cpp:7710
float GetAmmoDPS() const
Definition Player.h:1328
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
bool CanModifyStats() const
Definition Unit.h:1059
_Damage Damage[MAX_ITEM_PROTO_DAMAGES]
Definition ItemTemplate.h:651
uint32 Class
Definition ItemTemplate.h:621
float DamageMin
Definition ItemTemplate.h:579
float DamageMax
Definition ItemTemplate.h:580

References Unit::CanModifyStats(), CheckAmmoCompatibility(), ItemTemplate::Class, ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, GetAmmoDPS(), Object::GetUInt32Value(), ITEM_CLASS_PROJECTILE, m_ammoDPS, PLAYER_AMMO_ID, RANGED_ATTACK, sObjectMgr, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and SetAmmo().

◆ _ApplyItemBonuses()

void Player::_ApplyItemBonuses ( ItemTemplate const *  proto,
uint8  slot,
bool  apply,
bool  only_level_scale = false 
)
Deprecated:
item mods
6619{
6620 if (slot >= INVENTORY_SLOT_BAG_END || !proto)
6621 return;
6622
6623 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6624 if (only_level_scale && !ssd)
6625 return;
6626
6627 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6628 uint32 ssd_level = GetLevel();
6629 uint32 CustomScalingStatValue = 0;
6630
6631 sScriptMgr->OnPlayerCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6632
6633 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6634
6635 if (ssd && ssd_level > ssd->MaxLevel)
6636 ssd_level = ssd->MaxLevel;
6637
6638 ScalingStatValuesEntry const* ssv = proto->ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6639 if (only_level_scale && !ssv)
6640 return;
6641
6642 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
6643 {
6644 uint32 statType = 0;
6645 int32 val = 0;
6646 // If set ScalingStatDistribution need get stats and values from it
6647 if (ssv)
6648 {
6649 if (ssd)
6650 {
6651 if (ssd->StatMod[i] < 0)
6652 continue;
6653
6654 statType = ssd->StatMod[i];
6655 val = (ssv->getssdMultiplier(ScalingStatValue) * ssd->Modifier[i]) / 10000;
6656 }
6657 else
6658 {
6659 if (i >= proto->StatsCount)
6660 continue;
6661
6662 // OnCustomScalingStatValue(Player* player, ItemTemplate const* proto, uint32& statType, int32& val, uint8 itemProtoStatNumber, uint32 ScalingStatValue, ScalingStatValuesEntry const* ssv)
6663 sScriptMgr->OnPlayerCustomScalingStatValue(this, proto, statType, val, i, ScalingStatValue, ssv);
6664 }
6665 }
6666 else
6667 {
6668 if (i >= proto->StatsCount)
6669 continue;
6670
6671 statType = proto->ItemStat[i].ItemStatType;
6672 val = proto->ItemStat[i].ItemStatValue;
6673
6674 sScriptMgr->OnPlayerApplyItemModsBefore(this, slot, apply, i, statType, val);
6675 }
6676
6677 if (val == 0)
6678 continue;
6679
6680 switch (statType)
6681 {
6682 case ITEM_MOD_MANA:
6683 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(val), apply);
6684 break;
6685 case ITEM_MOD_HEALTH: // modify HP
6686 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(val), apply);
6687 break;
6688 case ITEM_MOD_AGILITY: // modify agility
6690 ApplyStatBuffMod(STAT_AGILITY, float(val), apply);
6691 break;
6692 case ITEM_MOD_STRENGTH: //modify strength
6694 ApplyStatBuffMod(STAT_STRENGTH, float(val), apply);
6695 break;
6696 case ITEM_MOD_INTELLECT: //modify intellect
6698 ApplyStatBuffMod(STAT_INTELLECT, float(val), apply);
6699 break;
6700 case ITEM_MOD_SPIRIT: //modify spirit
6702 ApplyStatBuffMod(STAT_SPIRIT, float(val), apply);
6703 break;
6704 case ITEM_MOD_STAMINA: //modify stamina
6706 ApplyStatBuffMod(STAT_STAMINA, float(val), apply);
6707 break;
6710 break;
6712 ApplyRatingMod(CR_DODGE, int32(val), apply);
6713 break;
6715 ApplyRatingMod(CR_PARRY, int32(val), apply);
6716 break;
6718 ApplyRatingMod(CR_BLOCK, int32(val), apply);
6719 break;
6721 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6722 break;
6724 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6725 break;
6727 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6728 break;
6730 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6731 break;
6733 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6734 break;
6736 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6737 break;
6740 break;
6743 break;
6746 break;
6749 break;
6752 break;
6755 break;
6757 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6758 break;
6760 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6761 break;
6763 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6764 break;
6766 ApplyRatingMod(CR_HIT_MELEE, int32(val), apply);
6767 ApplyRatingMod(CR_HIT_RANGED, int32(val), apply);
6768 ApplyRatingMod(CR_HIT_SPELL, int32(val), apply);
6769 break;
6771 ApplyRatingMod(CR_CRIT_MELEE, int32(val), apply);
6772 ApplyRatingMod(CR_CRIT_RANGED, int32(val), apply);
6773 ApplyRatingMod(CR_CRIT_SPELL, int32(val), apply);
6774 break;
6779 break;
6785 break;
6787 ApplyRatingMod(CR_HASTE_MELEE, int32(val), apply);
6788 ApplyRatingMod(CR_HASTE_RANGED, int32(val), apply);
6789 ApplyRatingMod(CR_HASTE_SPELL, int32(val), apply);
6790 break;
6792 ApplyRatingMod(CR_EXPERTISE, int32(val), apply);
6793 break;
6797 break;
6800 break;
6801 // case ITEM_MOD_FERAL_ATTACK_POWER:
6802 // ApplyFeralAPBonus(int32(val), apply);
6803 // break;
6805 ApplyManaRegenBonus(int32(val), apply);
6806 break;
6809 break;
6811 ApplySpellPowerBonus(int32(val), apply);
6812 break;
6814 ApplyHealthRegenBonus(int32(val), apply);
6815 break;
6817 ApplySpellPenetrationBonus(val, apply);
6818 break;
6820 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(val), apply);
6821 break;
6824 ApplySpellHealingBonus(int32(val), apply);
6825 break;
6827 ApplySpellDamageBonus(int32(val), apply);
6828 break;
6829 }
6830 }
6831
6832 // Apply Spell Power from ScalingStatValue if set
6833 if (ssv)
6834 if (int32 spellbonus = ssv->getSpellBonus(ScalingStatValue))
6835 ApplySpellPowerBonus(spellbonus, apply);
6836
6837 // If set ScalingStatValue armor get it or use item armor
6838 uint32 armor = proto->Armor;
6839 if (ssv)
6840 {
6841 if (uint32 ssvarmor = ssv->getArmorMod(ScalingStatValue))
6842 if (proto->ScalingStatValue > 0 || ssvarmor < proto->Armor) //Check to avoid higher values than stat itself (heirloom OR items with correct armor value)
6843 armor = ssvarmor;
6844 }
6845 else if (armor && proto->ArmorDamageModifier)
6846 armor -= uint32(proto->ArmorDamageModifier);
6847
6848 if (armor)
6849 {
6850 UnitModifierType modType = TOTAL_VALUE;
6851 if (proto->Class == ITEM_CLASS_ARMOR)
6852 {
6853 switch (proto->SubClass)
6854 {
6860 modType = BASE_VALUE;
6861 break;
6862 }
6863 }
6864 HandleStatModifier(UNIT_MOD_ARMOR, modType, float(armor), apply);
6865 }
6866
6867 // Add armor bonus from ArmorDamageModifier if > 0
6868 if (proto->ArmorDamageModifier > 0 && sScriptMgr->OnPlayerCanArmorDamageModifier(this))
6869 HandleStatModifier(UNIT_MOD_ARMOR, TOTAL_VALUE, float(proto->ArmorDamageModifier), apply);
6870
6871 if (proto->Block)
6872 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(proto->Block), apply);
6873
6874 if (proto->HolyRes)
6875 HandleStatModifier(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(proto->HolyRes), apply);
6876
6877 if (proto->FireRes)
6878 HandleStatModifier(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(proto->FireRes), apply);
6879
6880 if (proto->NatureRes)
6881 HandleStatModifier(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(proto->NatureRes), apply);
6882
6883 if (proto->FrostRes)
6884 HandleStatModifier(UNIT_MOD_RESISTANCE_FROST, BASE_VALUE, float(proto->FrostRes), apply);
6885
6886 if (proto->ShadowRes)
6887 HandleStatModifier(UNIT_MOD_RESISTANCE_SHADOW, BASE_VALUE, float(proto->ShadowRes), apply);
6888
6889 if (proto->ArcaneRes)
6890 HandleStatModifier(UNIT_MOD_RESISTANCE_ARCANE, BASE_VALUE, float(proto->ArcaneRes), apply);
6891
6893 if (attType != MAX_ATTACK)
6894 {
6895 _ApplyWeaponDamage(slot, proto, ssv, apply);
6896 }
6897
6898 // Druids get feral AP bonus from weapon dps (also use DPS from ScalingStatValue)
6900 {
6901 int32 dpsMod = 0;
6902 int32 feral_bonus = 0;
6903 if (ssv)
6904 {
6905 dpsMod = ssv->getDPSMod(ScalingStatValue);
6906 feral_bonus += ssv->getFeralBonus(ScalingStatValue);
6907 }
6908
6909 feral_bonus += proto->getFeralBonus(dpsMod);
6910 sScriptMgr->OnPlayerGetFeralApBonus(this, feral_bonus, dpsMod, proto, ssv);
6911 if (feral_bonus)
6912 ApplyFeralAPBonus(feral_bonus, apply);
6913 }
6914}
DBCStorage< ScalingStatDistributionEntry > sScalingStatDistributionStore(ScalingStatDistributionfmt)
DBCStorage< ScalingStatValuesEntry > sScalingStatValuesStore(ScalingStatValuesfmt)
std::int32_t int32
Definition Define.h:103
@ ITEM_MOD_CRIT_TAKEN_RANGED_RATING
Definition ItemTemplate.h:48
@ ITEM_MOD_HIT_MELEE_RATING
Definition ItemTemplate.h:38
@ ITEM_MOD_HIT_TAKEN_MELEE_RATING
Definition ItemTemplate.h:44
@ ITEM_MOD_STAMINA
Definition ItemTemplate.h:33
@ ITEM_MOD_HIT_SPELL_RATING
Definition ItemTemplate.h:40
@ ITEM_MOD_SPELL_PENETRATION
Definition ItemTemplate.h:69
@ ITEM_MOD_PARRY_RATING
Definition ItemTemplate.h:36
@ ITEM_MOD_DEFENSE_SKILL_RATING
Definition ItemTemplate.h:34
@ ITEM_MOD_HASTE_RANGED_RATING
Definition ItemTemplate.h:51
@ ITEM_MOD_CRIT_TAKEN_RATING
Definition ItemTemplate.h:56
@ ITEM_MOD_EXPERTISE_RATING
Definition ItemTemplate.h:59
@ ITEM_MOD_MANA
Definition ItemTemplate.h:27
@ ITEM_MOD_RANGED_ATTACK_POWER
Definition ItemTemplate.h:61
@ ITEM_MOD_HEALTH
Definition ItemTemplate.h:28
@ ITEM_MOD_CRIT_TAKEN_SPELL_RATING
Definition ItemTemplate.h:49
@ ITEM_MOD_HIT_TAKEN_SPELL_RATING
Definition ItemTemplate.h:46
@ ITEM_MOD_SPIRIT
Definition ItemTemplate.h:32
@ ITEM_MOD_SPELL_POWER
Definition ItemTemplate.h:67
@ ITEM_MOD_HASTE_SPELL_RATING
Definition ItemTemplate.h:52
@ ITEM_MOD_ATTACK_POWER
Definition ItemTemplate.h:60
@ ITEM_MOD_HASTE_RATING
Definition ItemTemplate.h:58
@ ITEM_MOD_HIT_RANGED_RATING
Definition ItemTemplate.h:39
@ ITEM_MOD_CRIT_SPELL_RATING
Definition ItemTemplate.h:43
@ ITEM_MOD_BLOCK_VALUE
Definition ItemTemplate.h:70
@ ITEM_MOD_CRIT_RANGED_RATING
Definition ItemTemplate.h:42
@ ITEM_MOD_CRIT_MELEE_RATING
Definition ItemTemplate.h:41
@ ITEM_MOD_STRENGTH
Definition ItemTemplate.h:30
@ ITEM_MOD_HEALTH_REGEN
Definition ItemTemplate.h:68
@ ITEM_MOD_BLOCK_RATING
Definition ItemTemplate.h:37
@ ITEM_MOD_ARMOR_PENETRATION_RATING
Definition ItemTemplate.h:66
@ ITEM_MOD_SPELL_HEALING_DONE
Definition ItemTemplate.h:63
@ ITEM_MOD_CRIT_TAKEN_MELEE_RATING
Definition ItemTemplate.h:47
@ ITEM_MOD_HIT_TAKEN_RATING
Definition ItemTemplate.h:55
@ ITEM_MOD_HASTE_MELEE_RATING
Definition ItemTemplate.h:50
@ ITEM_MOD_MANA_REGENERATION
Definition ItemTemplate.h:65
@ ITEM_MOD_HIT_RATING
Definition ItemTemplate.h:53
@ ITEM_MOD_INTELLECT
Definition ItemTemplate.h:31
@ ITEM_MOD_RESILIENCE_RATING
Definition ItemTemplate.h:57
@ ITEM_MOD_AGILITY
Definition ItemTemplate.h:29
@ ITEM_MOD_DODGE_RATING
Definition ItemTemplate.h:35
@ ITEM_MOD_CRIT_RATING
Definition ItemTemplate.h:54
@ ITEM_MOD_SPELL_DAMAGE_DONE
Definition ItemTemplate.h:64
@ ITEM_MOD_HIT_TAKEN_RANGED_RATING
Definition ItemTemplate.h:45
@ ITEM_SUBCLASS_ARMOR_MAIL
Definition ItemTemplate.h:393
@ ITEM_SUBCLASS_ARMOR_CLOTH
Definition ItemTemplate.h:391
@ ITEM_SUBCLASS_ARMOR_LEATHER
Definition ItemTemplate.h:392
@ ITEM_SUBCLASS_ARMOR_SHIELD
Definition ItemTemplate.h:396
@ ITEM_SUBCLASS_ARMOR_PLATE
Definition ItemTemplate.h:394
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
#define MAX_ITEM_PROTO_STATS
Definition ItemTemplate.h:616
@ CLASS_DRUID
Definition SharedDefines.h:151
@ STAT_SPIRIT
Definition SharedDefines.h:273
@ STAT_INTELLECT
Definition SharedDefines.h:272
@ STAT_AGILITY
Definition SharedDefines.h:270
@ STAT_STRENGTH
Definition SharedDefines.h:269
@ STAT_STAMINA
Definition SharedDefines.h:271
@ CLASS_CONTEXT_STATS
Definition UnitDefines.h:234
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:148
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:149
@ UNIT_MOD_ARMOR
Definition Unit.h:158
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:163
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:162
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:165
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:159
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:164
@ UNIT_MOD_HEALTH
Definition Unit.h:150
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:160
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:145
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:161
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:146
@ UNIT_MOD_MANA
Definition Unit.h:151
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:147
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:166
@ SHIELD_BLOCK_VALUE
Definition Unit.h:185
UnitModifierType
Definition Unit.h:127
@ BASE_VALUE
Definition Unit.h:128
@ TOTAL_VALUE
Definition Unit.h:130
@ CR_EXPERTISE
Definition Unit.h:242
@ CR_HIT_TAKEN_MELEE
Definition Unit.h:230
@ CR_HASTE_RANGED
Definition Unit.h:237
@ CR_HIT_MELEE
Definition Unit.h:224
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:234
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:235
@ CR_ARMOR_PENETRATION
Definition Unit.h:243
@ CR_CRIT_MELEE
Definition Unit.h:227
@ CR_CRIT_RANGED
Definition Unit.h:228
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:232
@ CR_PARRY
Definition Unit.h:222
@ CR_DODGE
Definition Unit.h:221
@ CR_DEFENSE_SKILL
Definition Unit.h:220
@ CR_HASTE_MELEE
Definition Unit.h:236
@ CR_BLOCK
Definition Unit.h:223
@ CR_HASTE_SPELL
Definition Unit.h:238
@ CR_HIT_SPELL
Definition Unit.h:226
@ CR_HIT_TAKEN_RANGED
Definition Unit.h:231
@ CR_CRIT_SPELL
Definition Unit.h:229
@ CR_HIT_RANGED
Definition Unit.h:225
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:233
void ApplySpellDamageBonus(int32 amount, bool apply)
Definition StatSystem.cpp:177
void ApplyRatingMod(CombatRating cr, int32 value, bool apply)
Definition Player.cpp:5278
void ApplySpellPenetrationBonus(int32 amount, bool apply)
Definition StatSystem.cpp:236
void _ApplyWeaponDamage(uint8 slot, ItemTemplate const *proto, ScalingStatValuesEntry const *ssv, bool apply)
Definition Player.cpp:6916
void ApplyManaRegenBonus(int32 amount, bool apply)
Definition StatSystem.cpp:932
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1299
void ApplySpellPowerBonus(int32 amount, bool apply)
Definition StatSystem.cpp:167
void ApplyFeralAPBonus(int32 amount, bool apply)
Definition StatSystem.cpp:341
void ApplyHealthRegenBonus(int32 amount, bool apply)
Definition StatSystem.cpp:938
void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply)
Definition Player.cpp:5037
void ApplySpellHealingBonus(int32 amount, bool apply)
Definition StatSystem.cpp:186
void ApplyStatBuffMod(Stats stat, float val, bool apply)
Definition Unit.h:1061
bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
Definition Unit.cpp:15232
uint8 GetLevel() const
Definition Unit.h:1065
Definition DBCStructure.h:1474
uint32 MaxLevel
Definition DBCStructure.h:1478
uint32 Modifier[10]
Definition DBCStructure.h:1477
int32 StatMod[10]
Definition DBCStructure.h:1476
Definition DBCStructure.h:1482
uint32 getArmorMod(uint32 mask) const
Definition DBCStructure.h:1507
uint32 getDPSMod(uint32 mask) const
Definition DBCStructure.h:1525
uint32 getFeralBonus(uint32 mask) const
Definition DBCStructure.h:1555
uint32 getssdMultiplier(uint32 mask) const
Definition DBCStructure.h:1493
uint32 getSpellBonus(uint32 mask) const
Definition DBCStructure.h:1549

References _ApplyWeaponDamage(), ApplyFeralAPBonus(), ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellDamageBonus(), ApplySpellHealingBonus(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), ItemTemplate::ArcaneRes, ItemTemplate::Armor, ItemTemplate::ArmorDamageModifier, BASE_VALUE, ItemTemplate::Block, ItemTemplate::Class, CLASS_CONTEXT_STATS, CLASS_DRUID, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, ItemTemplate::FireRes, FLAT_MOD, ItemTemplate::FrostRes, ScalingStatValuesEntry::getArmorMod(), GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), ItemTemplate::getFeralBonus(), ScalingStatValuesEntry::getFeralBonus(), Unit::GetLevel(), ScalingStatValuesEntry::getSpellBonus(), ScalingStatValuesEntry::getssdMultiplier(), HandleBaseModValue(), Unit::HandleStatModifier(), ItemTemplate::HolyRes, INVENTORY_SLOT_BAG_END, IsClass(), ITEM_CLASS_ARMOR, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_CRIT_TAKEN_MELEE_RATING, ITEM_MOD_CRIT_TAKEN_RANGED_RATING, ITEM_MOD_CRIT_TAKEN_RATING, ITEM_MOD_CRIT_TAKEN_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_MELEE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_HIT_TAKEN_MELEE_RATING, ITEM_MOD_HIT_TAKEN_RANGED_RATING, ITEM_MOD_HIT_TAKEN_RATING, ITEM_MOD_HIT_TAKEN_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, MAX_ATTACK, MAX_ITEM_PROTO_STATS, ScalingStatDistributionEntry::MaxLevel, ScalingStatDistributionEntry::Modifier, ItemTemplate::NatureRes, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, ItemTemplate::ShadowRes, SHIELD_BLOCK_VALUE, sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, ScalingStatDistributionEntry::StatMod, ItemTemplate::StatsCount, ItemTemplate::SubClass, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), and _RemoveAllItemMods().

◆ _ApplyItemMods()

void Player::_ApplyItemMods ( Item item,
uint8  slot,
bool  apply 
)
6584{
6585 if (slot >= INVENTORY_SLOT_BAG_END || !item)
6586 return;
6587
6588 ItemTemplate const* proto = item->GetTemplate();
6589
6590 if (!proto)
6591 return;
6592
6593 // not apply/remove mods for broken item
6594 if (item->IsBroken())
6595 return;
6596
6597 LOG_DEBUG("entities.player", "applying mods for item {} ", item->GetGUID().ToString());
6598
6599 WeaponAttackType attacktype = Player::GetAttackBySlot(slot);
6600
6601 if (item->HasSocket()) //only (un)equipping of items with sockets can influence metagems, so no need to waste time with normal items
6602 CorrectMetaGemEnchants(slot, apply);
6603
6604 if (attacktype < MAX_ATTACK)
6605 _ApplyWeaponDependentAuraMods(item, attacktype, apply);
6606
6607 _ApplyItemBonuses(proto, slot, apply);
6608
6609 if (slot == EQUIPMENT_SLOT_RANGED)
6611
6612 ApplyItemEquipSpell(item, apply);
6613 ApplyEnchantment(item, apply);
6614
6615 LOG_DEBUG("entities.player.items", "_ApplyItemMods complete.");
6616}
bool HasSocket() const
Definition Item.cpp:1007
bool IsBroken() const
Definition Item.h:257
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
void CorrectMetaGemEnchants(uint8 slot, bool apply)
Definition Player.cpp:11228

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), CorrectMetaGemEnchants(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Object::GetGUID(), Item::GetTemplate(), Item::HasSocket(), INVENTORY_SLOT_BAG_END, Item::IsBroken(), LOG_DEBUG, MAX_ATTACK, and ObjectGuid::ToString().

Referenced by _ApplyAllLevelScaleItemMods(), DestroyItem(), DurabilityPointsLoss(), DurabilityRepair(), EquipItem(), and RemoveItem().

◆ _ApplyWeaponDamage()

void Player::_ApplyWeaponDamage ( uint8  slot,
ItemTemplate const *  proto,
ScalingStatValuesEntry const *  ssv,
bool  apply 
)
6917{
6918 uint32 CustomScalingStatValue = 0;
6919
6920 sScriptMgr->OnPlayerCustomScalingStatValueBefore(this, proto, slot, apply, CustomScalingStatValue);
6921
6922 uint32 ScalingStatValue = proto->ScalingStatValue > 0 ? proto->ScalingStatValue : CustomScalingStatValue;
6923
6924 // following part fix disarm issue
6925 // that doesn't apply the scaling after disarmed
6926 if (!ssv)
6927 {
6928 ScalingStatDistributionEntry const* ssd = proto->ScalingStatDistribution ? sScalingStatDistributionStore.LookupEntry(proto->ScalingStatDistribution) : nullptr;
6929
6930 // req. check at equip, but allow use for extended range if range limit max level, set proper level
6931 uint32 ssd_level = GetLevel();
6932
6933 if (ssd && ssd_level > ssd->MaxLevel)
6934 ssd_level = ssd->MaxLevel;
6935
6936 ssv = ScalingStatValue ? sScalingStatValuesStore.LookupEntry(ssd_level) : nullptr;
6937 }
6938
6940 if (!IsInFeralForm() && apply && !CanUseAttackType(attType))
6941 {
6942 return;
6943 }
6944
6945 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6946 {
6947 float minDamage = proto->Damage[i].DamageMin;
6948 float maxDamage = proto->Damage[i].DamageMax;
6949
6950 // If set dpsMod in ScalingStatValue use it for min (70% from average), max (130% from average) damage
6951 if (ssv && i == 0) // scaling stats only for first damage
6952 {
6953 int32 extraDPS = ssv->getDPSMod(ScalingStatValue);
6954 if (extraDPS)
6955 {
6956 float average = extraDPS * proto->Delay / 1000.0f;
6957 float mod = ssv->IsTwoHand(proto->ScalingStatValue) ? 0.2f : 0.3f;
6958
6959 minDamage = (1.0f - mod) * average;
6960 maxDamage = (1.0f + mod) * average;
6961 }
6962 }
6963
6964 if (apply)
6965 {
6966 sScriptMgr->OnPlayerApplyWeaponDamage(this, slot, proto, minDamage, maxDamage, i);
6967
6968 if (minDamage > 0.f)
6969 {
6970 SetBaseWeaponDamage(attType, MINDAMAGE, minDamage, i);
6971 }
6972
6973 if (maxDamage > 0.f)
6974 {
6975 SetBaseWeaponDamage(attType, MAXDAMAGE, maxDamage, i);
6976 }
6977 }
6978 }
6979
6980 if (!apply)
6981 {
6982 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6983 {
6984 SetBaseWeaponDamage(attType, MINDAMAGE, 0.f, i);
6985 SetBaseWeaponDamage(attType, MAXDAMAGE, 0.f, i);
6986 }
6987
6988 if (attType == BASE_ATTACK)
6989 {
6992 }
6993 }
6994
6995 if (proto->Delay && !IsInFeralForm())
6996 {
6997 if (slot == EQUIPMENT_SLOT_RANGED)
6998 SetAttackTime(RANGED_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
6999 else if (slot == EQUIPMENT_SLOT_MAINHAND)
7000 SetAttackTime(BASE_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
7001 else if (slot == EQUIPMENT_SLOT_OFFHAND)
7002 SetAttackTime(OFF_ATTACK, apply ? proto->Delay : BASE_ATTACK_TIME);
7003 }
7004
7005 // No need to modify any physical damage for ferals as it is calculated from stats only
7006 if (IsInFeralForm())
7007 return;
7008
7009 if (CanModifyStats() && (GetWeaponDamageRange(attType, MAXDAMAGE) || proto->Delay))
7010 UpdateDamagePhysical(attType);
7011}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:685
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:686
@ MINDAMAGE
Definition Unit.h:137
@ MAXDAMAGE
Definition Unit.h:138
#define BASE_ATTACK_TIME
Definition Unit.h:43
@ OFF_ATTACK
Definition Unit.h:212
@ BASE_ATTACK
Definition Unit.h:211
#define BASE_MAXDAMAGE
Definition Unit.h:42
#define BASE_MINDAMAGE
Definition Unit.h:41
float GetWeaponDamageRange(WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
Definition Unit.cpp:15481
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
Definition Unit.h:1178
bool IsInFeralForm() const
Definition Unit.h:1914
void SetAttackTime(WeaponAttackType att, uint32 val)
Definition Unit.h:903

References BASE_ATTACK, BASE_ATTACK_TIME, BASE_MAXDAMAGE, BASE_MINDAMAGE, Unit::CanModifyStats(), Unit::CanUseAttackType(), ItemTemplate::Damage, _Damage::DamageMax, _Damage::DamageMin, ItemTemplate::Delay, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), ScalingStatValuesEntry::getDPSMod(), Unit::GetLevel(), Unit::GetWeaponDamageRange(), Unit::IsInFeralForm(), ScalingStatValuesEntry::IsTwoHand(), MAX_ITEM_PROTO_DAMAGES, MAXDAMAGE, ScalingStatDistributionEntry::MaxLevel, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, ItemTemplate::ScalingStatDistribution, ItemTemplate::ScalingStatValue, Unit::SetAttackTime(), Unit::SetBaseWeaponDamage(), sScalingStatDistributionStore, sScalingStatValuesStore, sScriptMgr, and Unit::UpdateDamagePhysical().

Referenced by _ApplyItemBonuses(), AuraEffect::HandleAuraModDisarm(), and AuraEffect::HandleAuraModShapeshift().

◆ _ApplyWeaponDependentAuraCritMod()

void Player::_ApplyWeaponDependentAuraCritMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
7087{
7088 // don't apply mod if item is broken or cannot be used
7089 if (item->IsBroken() || !CanUseAttackType(attackType))
7090 return;
7091
7092 // generic not weapon specific case processes in aura code
7093 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7094 return;
7095
7096 if (!sScriptMgr->OnPlayerCanApplyWeaponDependentAuraDamageMod(this, item, attackType, aura, apply))
7097 return;
7098
7100 switch (attackType)
7101 {
7102 case BASE_ATTACK:
7103 mod = CRIT_PERCENTAGE;
7104 break;
7105 case OFF_ATTACK:
7107 break;
7108 case RANGED_ATTACK:
7110 break;
7111 default:
7112 return;
7113 }
7114
7115 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7116 HandleBaseModValue(mod, FLAT_MOD, float (aura->GetAmount()), apply);
7117}
BaseModGroup
Definition Unit.h:181
@ OFFHAND_CRIT_PERCENTAGE
Definition Unit.h:184
@ CRIT_PERCENTAGE
Definition Unit.h:182
@ RANGED_CRIT_PERCENTAGE
Definition Unit.h:183
bool IsFitToSpellRequirements(SpellInfo const *spellInfo) const
Definition Item.cpp:884

References BASE_ATTACK, BASEMOD_END, Unit::CanUseAttackType(), CRIT_PERCENTAGE, SpellInfo::EquippedItemClass, FLAT_MOD, AuraEffect::GetAmount(), AuraEffect::GetSpellInfo(), HandleBaseModValue(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, and sScriptMgr.

Referenced by _ApplyWeaponDependentAuraMods(), and AuraEffect::HandleAuraModWeaponCritPercent().

◆ _ApplyWeaponDependentAuraDamageMod()

void Player::_ApplyWeaponDependentAuraDamageMod ( Item item,
WeaponAttackType  attackType,
AuraEffect const *  aura,
bool  apply 
)
7120{
7121 // don't apply mod if item is broken or cannot be used
7122 if (item->IsBroken() || !CanUseAttackType(attackType))
7123 return;
7124
7125 // ignore spell mods for not wands
7126 if ((aura->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) == 0 && (getClassMask() & CLASSMASK_WAND_USERS) == 0)
7127 return;
7128
7129 // generic not weapon specific case processes in aura code
7130 if (aura->GetSpellInfo()->EquippedItemClass == -1)
7131 return;
7132
7133 UnitMods unitMod = UNIT_MOD_END;
7134 switch (attackType)
7135 {
7136 case BASE_ATTACK:
7137 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
7138 break;
7139 case OFF_ATTACK:
7140 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
7141 break;
7142 case RANGED_ATTACK:
7143 unitMod = UNIT_MOD_DAMAGE_RANGED;
7144 break;
7145 default:
7146 return;
7147 }
7148
7149 UnitModifierType unitModType = TOTAL_VALUE;
7150 switch (aura->GetAuraType())
7151 {
7153 unitModType = TOTAL_VALUE;
7154 break;
7156 unitModType = TOTAL_PCT;
7157 break;
7158 default:
7159 return;
7160 }
7161
7162 if (item->IsFitToSpellRequirements(aura->GetSpellInfo()))
7163 {
7164 HandleStatModifier(unitMod, unitModType, float(aura->GetAmount()), apply);
7165 if (unitModType == TOTAL_VALUE)
7166 {
7167 if (aura->GetAmount() > 0)
7168 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS, aura->GetAmount(), apply);
7169 else
7170 ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, aura->GetAmount(), apply);
7171 }
7172 }
7173}
#define CLASSMASK_WAND_USERS
Definition SharedDefines.h:174
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:308
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
UnitMods
Definition Unit.h:144
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:168
@ UNIT_MOD_END
Definition Unit.h:170
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:169
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:167
@ TOTAL_PCT
Definition Unit.h:131
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
Definition UpdateFields.h:360
@ PLAYER_FIELD_MOD_DAMAGE_DONE_NEG
Definition UpdateFields.h:361
void ApplyModUInt32Value(uint16 index, int32 val, bool apply)
Definition Object.cpp:795
uint32 getClassMask() const
Definition Unit.h:828

References Object::ApplyModUInt32Value(), BASE_ATTACK, Unit::CanUseAttackType(), CLASSMASK_WAND_USERS, SpellInfo::EquippedItemClass, AuraEffect::GetAmount(), AuraEffect::GetAuraType(), Unit::getClassMask(), AuraEffect::GetMiscValue(), AuraEffect::GetSpellInfo(), Unit::HandleStatModifier(), Item::IsBroken(), Item::IsFitToSpellRequirements(), OFF_ATTACK, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, RANGED_ATTACK, SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_SCHOOL_MASK_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, and UNIT_MOD_END.

Referenced by _ApplyWeaponDependentAuraMods(), AuraEffect::HandleModDamageDone(), and AuraEffect::HandleModDamagePercentDone().

◆ _ApplyWeaponDependentAuraMods()

void Player::_ApplyWeaponDependentAuraMods ( Item item,
WeaponAttackType  attackType,
bool  apply 
)
7072{
7074 for (AuraEffectList::const_iterator itr = auraCritList.begin(); itr != auraCritList.end(); ++itr)
7075 _ApplyWeaponDependentAuraCritMod(item, attackType, *itr, apply);
7076
7078 for (AuraEffectList::const_iterator itr = auraDamageFlatList.begin(); itr != auraDamageFlatList.end(); ++itr)
7079 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
7080
7082 for (AuraEffectList::const_iterator itr = auraDamagePctList.begin(); itr != auraDamagePctList.end(); ++itr)
7083 _ApplyWeaponDependentAuraDamageMod(item, attackType, *itr, apply);
7084}
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
void _ApplyWeaponDependentAuraDamageMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition Player.cpp:7119
void _ApplyWeaponDependentAuraCritMod(Item *item, WeaponAttackType attackType, AuraEffect const *aura, bool apply)
Definition Player.cpp:7086
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1391
std::vector< AuraEffect * > AuraEffectList
Definition Unit.h:666

References _ApplyWeaponDependentAuraCritMod(), _ApplyWeaponDependentAuraDamageMod(), Unit::GetAuraEffectsByType(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and AuraEffect::HandleAuraModDisarm().

◆ _LoadActions()

void Player::_LoadActions ( PreparedQueryResult  result)
protected
5680{
5681 m_actionButtons.clear();
5682
5683 if (result)
5684 {
5685 do
5686 {
5687 Field* fields = result->Fetch();
5688 uint8 button = fields[0].Get<uint8>();
5689 uint32 action = fields[1].Get<uint32>();
5690 uint8 type = fields[2].Get<uint8>();
5691
5692 if (ActionButton* ab = addActionButton(button, action, type))
5693 ab->uState = ACTIONBUTTON_UNCHANGED;
5694 else
5695 {
5696
5697 LOG_ERROR("entities.player", "ActionButton loading problem, will be deleted from db. player: {}, guid: {}, button: {}, action: {}, type: {}", GetName(), GetGUID().GetCounter(), button, action, type);
5698
5699 // Will deleted in DB at next save (it can create data until save but marked as deleted)
5700 m_actionButtons[button].uState = ACTIONBUTTON_DELETED;
5701 }
5702 } while (result->NextRow());
5703 }
5704}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ ACTIONBUTTON_UNCHANGED
Definition Player.h:223
@ ACTIONBUTTON_DELETED
Definition Player.h:226
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
ActionButton * addActionButton(uint8 button, uint32 action, uint8 type)
Definition Player.cpp:5641
ActionButtonList m_actionButtons
Definition Player.h:2832
std::string const & GetName() const
Definition Object.h:525
Definition Player.h:249

References ACTIONBUTTON_DELETED, ACTIONBUTTON_UNCHANGED, addActionButton(), Field::Get(), Object::GetGUID(), WorldObject::GetName(), LOG_ERROR, and m_actionButtons.

Referenced by WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and LoadFromDB().

◆ _LoadArenaTeamInfo()

void Player::_LoadArenaTeamInfo ( )
protected
4803{
4805
4806 for (auto const& itr : ArenaTeam::ArenaSlotByType)
4807 if (uint32 arenaTeamId = sCharacterCache->GetCharacterArenaTeamIdByGuid(GetGUID(), itr.second))
4808 {
4809 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
4810 if (!arenaTeam)
4811 {
4812 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No arena team was found.");
4813 continue;
4814 }
4815 ArenaTeamMember const* member = arenaTeam->GetMember(GetGUID());
4816 if (!member)
4817 {
4818 LOG_ERROR("bg.arena", "Player::_LoadArenaTeamInfo: No members in the arena team ({}) was found.", arenaTeamId);
4819 continue;
4820 }
4821 uint8 slot = itr.second;
4822
4823 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, arenaTeamId);
4824 SetArenaTeamInfoField(slot, ARENA_TEAM_TYPE, arenaTeam->GetType());
4825 SetArenaTeamInfoField(slot, ARENA_TEAM_MEMBER, (arenaTeam->GetCaptain() == GetGUID()) ? 0 : 1);
4830 }
4831}
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:69
#define MAX_ARENA_SLOT
Definition ArenaTeam.h:134
@ ARENA_TEAM_GAMES_WEEK
Definition ArenaTeam.h:77
@ ARENA_TEAM_TYPE
Definition ArenaTeam.h:75
@ ARENA_TEAM_ID
Definition ArenaTeam.h:74
@ ARENA_TEAM_END
Definition ArenaTeam.h:81
@ ARENA_TEAM_PERSONAL_RATING
Definition ArenaTeam.h:80
@ ARENA_TEAM_MEMBER
Definition ArenaTeam.h:76
@ ARENA_TEAM_WINS_SEASON
Definition ArenaTeam.h:79
@ ARENA_TEAM_GAMES_SEASON
Definition ArenaTeam.h:78
#define sCharacterCache
Definition CharacterCache.h:83
@ PLAYER_FIELD_ARENA_TEAM_INFO_1_1
Definition UpdateFields.h:381
Definition ArenaTeam.h:137
ObjectGuid GetCaptain() const
Definition ArenaTeam.h:153
ArenaTeamMember * GetMember(ObjectGuid guid)
Definition ArenaTeam.cpp:1015
uint32 GetType() const
Definition ArenaTeam.h:149
uint32 * m_uint32Values
Definition Object.h:260
void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value)
Definition Player.cpp:16211
Definition ArenaTeam.h:108
uint16 PersonalRating
Definition ArenaTeam.h:116
uint16 SeasonWins
Definition ArenaTeam.h:115
uint16 WeekGames
Definition ArenaTeam.h:112
uint16 SeasonGames
Definition ArenaTeam.h:114

References ARENA_TEAM_END, ARENA_TEAM_GAMES_SEASON, ARENA_TEAM_GAMES_WEEK, ARENA_TEAM_ID, ARENA_TEAM_MEMBER, ARENA_TEAM_PERSONAL_RATING, ARENA_TEAM_TYPE, ARENA_TEAM_WINS_SEASON, ArenaTeam::ArenaSlotByType, ArenaTeam::GetCaptain(), Object::GetGUID(), ArenaTeam::GetMember(), ArenaTeam::GetType(), LOG_ERROR, Object::m_uint32Values, MAX_ARENA_SLOT, ArenaTeamMember::PersonalRating, PLAYER_FIELD_ARENA_TEAM_INFO_1_1, sArenaTeamMgr, sCharacterCache, ArenaTeamMember::SeasonGames, ArenaTeamMember::SeasonWins, SetArenaTeamInfoField(), and ArenaTeamMember::WeekGames.

Referenced by LoadFromDB().

◆ _LoadAuras()

void Player::_LoadAuras ( PreparedQueryResult  result,
uint32  timediff 
)
protected
5707{
5708 LOG_DEBUG("entities.player.loading", "Loading auras for player {}", GetGUID().ToString());
5709
5710 /* 0 1 2 3 4 5 6 7 8 9 10 11
5711 QueryResult* result = CharacterDatabase.Query("SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
5712 12 13 14
5713 maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = '{}'", GetGUID().GetCounter());
5714 */
5715
5716 if (result)
5717 {
5718 do
5719 {
5720 Field* fields = result->Fetch();
5721 int32 damage[3];
5722 int32 baseDamage[3];
5723 ObjectGuid caster_guid = ObjectGuid(fields[0].Get<uint64>());
5724 ObjectGuid itemGuid = ObjectGuid(fields[1].Get<uint64>());
5725 uint32 spellid = fields[2].Get<uint32>();
5726 uint8 effmask = fields[3].Get<uint8>();
5727 uint8 recalculatemask = fields[4].Get<uint8>();
5728 uint8 stackcount = fields[5].Get<uint8>();
5729 damage[0] = fields[6].Get<int32>();
5730 damage[1] = fields[7].Get<int32>();
5731 damage[2] = fields[8].Get<int32>();
5732 baseDamage[0] = fields[9].Get<int32>();
5733 baseDamage[1] = fields[10].Get<int32>();
5734 baseDamage[2] = fields[11].Get<int32>();
5735 int32 maxduration = fields[12].Get<int32>();
5736 int32 remaintime = fields[13].Get<int32>();
5737 uint8 remaincharges = fields[14].Get<uint8>();
5738
5739 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
5740 if (!spellInfo)
5741 {
5742 LOG_ERROR("entities.player", "Unknown aura (spellid {}), ignore.", spellid);
5743 continue;
5744 }
5745
5746 // Xinef: leave this
5747 if (spellInfo->HasAura(SPELL_AURA_MOUNTED))
5748 {
5749 SetMountBlockId(spellInfo->Id);
5750 continue;
5751 }
5752
5753 // negative effects should continue counting down after logout
5754 if (remaintime != -1 && ((!spellInfo->IsPositive() && spellInfo->Id != 15007) || spellInfo->HasAttribute(SPELL_ATTR4_AURA_EXPIRES_OFFLINE))) // Xinef: resurrection sickness should not tick when logged off
5755 {
5756 if (remaintime / IN_MILLISECONDS <= int32(timediff))
5757 continue;
5758
5759 remaintime -= timediff * IN_MILLISECONDS;
5760 }
5761
5762 // prevent wrong values of remaincharges
5763 if (spellInfo->ProcCharges)
5764 {
5765 // we have no control over the order of applying auras and modifiers allow auras
5766 // to have more charges than value in SpellInfo
5767 if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
5768 remaincharges = spellInfo->ProcCharges;
5769 }
5770 else
5771 remaincharges = 0;
5772
5773 if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, nullptr, &baseDamage[0], nullptr, caster_guid, itemGuid))
5774 {
5775 if (!aura->CanBeSaved())
5776 {
5777 aura->Remove();
5778 continue;
5779 }
5780
5781 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
5782 aura->ApplyForTargets();
5783 LOG_DEBUG("entities.player", "Added aura spellid {}, effectmask {}", spellInfo->Id, effmask);
5784 }
5785 } while (result->NextRow());
5786 }
5787}
@ SPELL_ATTR4_AURA_EXPIRES_OFFLINE
Definition SharedDefines.h:543
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:352
Definition ObjectGuid.h:118
void SetMountBlockId(uint32 mount)
Definition Player.h:2605

References Field::Get(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, SetMountBlockId(), SPELL_ATTR4_AURA_EXPIRES_OFFLINE, SPELL_AURA_MOUNTED, sSpellMgr, Position::ToString(), and Aura::TryCreate().

Referenced by LoadFromDB().

◆ _LoadBrewOfTheMonth()

void Player::_LoadBrewOfTheMonth ( PreparedQueryResult  result)
protected
15900{
15901 uint32 lastEventId = 0;
15902 if (result)
15903 {
15904 Field* fields = result->Fetch();
15905 lastEventId = fields[0].Get<uint32>();
15906 }
15907
15908 uint16 month = static_cast<uint16>(Acore::Time::GetMonth());
15909 uint16 eventId = month;
15910 if (eventId < 9)
15911 eventId += 3;
15912 else
15913 eventId -= 9;
15914
15915 // Brew of the Month October (first in list)
15916 eventId += 34;
15917
15918 if (lastEventId != eventId && IsEventActive(eventId) && HasAchieved(2796 /* Brew of the Month*/))
15919 {
15920 // Send Mail
15921 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15922 MailSender sender(MAIL_CREATURE, 27487 /*NPC_BREW_OF_THE_MONTH_CLUB*/);
15923 MailDraft draft(uint16(212 + month)); // 212 is starting template id
15924 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
15925
15926 // Update Event Id
15928 stmt->SetData(0, GetGUID().GetCounter());
15929 stmt->SetData(1, uint32(eventId));
15930 trans->Append(stmt);
15931
15932 CharacterDatabase.CommitTransaction(trans);
15933 }
15934}
@ CHAR_REP_BREW_OF_THE_MONTH
Definition CharacterDatabase.h:103
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
bool IsEventActive(uint16 eventId)
Definition GameEventMgr.cpp:1965
@ MAIL_CREATURE
Definition Mail.h:39
Definition Mail.h:119
Definition Mail.h:105
Definition Mail.h:83
bool HasAchieved(uint32 achievementId) const
Definition Player.cpp:13968
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
AC_COMMON_API uint32 GetMonth(Seconds time=0s)
Definition Timer.cpp:424

References CHAR_REP_BREW_OF_THE_MONTH, CharacterDatabase, Field::Get(), Object::GetGUID(), Acore::Time::GetMonth(), HasAchieved(), IsEventActive(), MAIL_CREATURE, MailDraft::SendMailTo(), and PreparedStatementBase::SetData().

Referenced by LoadFromDB().

◆ _LoadCharacterSettings()

void Player::_LoadCharacterSettings ( PreparedQueryResult  result)
protected
111{
112 m_charSettingsMap.clear();
113
114 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
115 return;
116
117 if (!result)
118 return;
119
120 do
121 {
122 Field* fields = result->Fetch();
123 std::string source = fields[0].Get<std::string>();
124 std::string data = fields[1].Get<std::string>();
125
127 m_charSettingsMap.emplace(std::move(source), std::move(settings));
128
129 } while (result->NextRow());
130}
std::vector< PlayerSetting > PlayerSettingVector
Definition PlayerSettings.h:52
@ CONFIG_PLAYER_SETTINGS_ENABLED
Definition WorldConfig.h:129
PlayerSettingMap m_charSettingsMap
Definition Player.h:3022
PlayerSettingVector ParseSettingsData(std::string const &data)
Definition PlayerSettings.cpp:30

References CONFIG_PLAYER_SETTINGS_ENABLED, Field::Get(), m_charSettingsMap, PlayerSettingsStore::ParseSettingsData(), and sWorld.

Referenced by LoadFromDB().

◆ _LoadDailyQuestStatus()

void Player::_LoadDailyQuestStatus ( PreparedQueryResult  result)
protected
6357{
6358 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
6359 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
6360
6361 m_DFQuests.clear();
6362
6363 //QueryResult* result = CharacterDatabase.Query("SELECT quest, time FROM character_queststatus_daily WHERE guid = '{}'", GetGUID().GetCounter());
6364
6365 if (result)
6366 {
6367 uint32 quest_daily_idx = 0;
6368
6369 do
6370 {
6371 Field* fields = result->Fetch();
6372 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(fields[0].Get<uint32>()))
6373 {
6374 if (qQuest->IsDFQuest())
6375 {
6376 m_DFQuests.insert(qQuest->GetQuestId());
6377 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6378 continue;
6379 }
6380 }
6381
6382 if (quest_daily_idx >= PLAYER_MAX_DAILY_QUESTS) // max amount with exist data in query
6383 {
6384 LOG_ERROR("entities.player", "Player ({}) have more 25 daily quest records in `charcter_queststatus_daily`", GetGUID().ToString());
6385 break;
6386 }
6387
6388 uint32 quest_id = fields[0].Get<uint32>();
6389
6390 // save _any_ from daily quest times (it must be after last reset anyway)
6391 m_lastDailyQuestTime = time_t(fields[1].Get<uint32>());
6392
6393 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6394 if (!quest)
6395 continue;
6396
6397 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
6398 ++quest_daily_idx;
6399
6400 LOG_DEBUG("entities.player.loading", "Daily quest ({}) cooldown for player ({})", quest_id, GetGUID().ToString());
6401 } while (result->NextRow());
6402 }
6403
6404 m_DailyQuestChanged = false;
6405}
#define PLAYER_MAX_DAILY_QUESTS
Definition Player.h:72
@ PLAYER_FIELD_DAILY_QUESTS_1
Definition UpdateFields.h:385
DFQuestsDoneList m_DFQuests
Definition Player.h:2414
Definition QuestDef.h:210
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21198

References Field::Get(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadDeclinedNames()

void Player::_LoadDeclinedNames ( PreparedQueryResult  result)
protected
4792{
4793 if (!result)
4794 return;
4795
4796 delete m_declinedname;
4798 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
4799 m_declinedname->name[i] = (*result)[i].Get<std::string>();
4800}
#define MAX_DECLINED_NAME_CASES
Definition Unit.h:530
Definition Unit.h:533
std::string name[MAX_DECLINED_NAME_CASES]
Definition Unit.h:534

References m_declinedname, MAX_DECLINED_NAME_CASES, and DeclinedName::name.

Referenced by LoadFromDB().

◆ _LoadEntryPointData()

void Player::_LoadEntryPointData ( PreparedQueryResult  result)
protected
4865{
4866 if (!result)
4867 return;
4868
4869 Field* fields = result->Fetch();
4870 m_entryPointData.joinPos = WorldLocation(fields[4].Get<uint32>(), // Map
4871 fields[0].Get<float>(), // X
4872 fields[1].Get<float>(), // Y
4873 fields[2].Get<float>(), // Z
4874 fields[3].Get<float>()); // Orientation
4875
4876 m_entryPointData.taxiPath[0] = fields[5].Get<uint32>();
4877 m_entryPointData.taxiPath[1] = fields[6].Get<uint32>();
4878 m_entryPointData.mountSpell = fields[7].Get<uint32>();
4879}
EntryPointData m_entryPointData
Definition Player.h:2697
Definition Position.h:256
uint32 mountSpell
Definition Player.h:1050
std::array< uint32, 2 > taxiPath
Definition Player.h:1051
WorldLocation joinPos
Definition Player.h:1052

References Field::Get(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, and EntryPointData::taxiPath.

Referenced by LoadFromDB().

◆ _LoadEquipmentSets()

void Player::_LoadEquipmentSets ( PreparedQueryResult  result)
protected
4834{
4835 // SetQuery(PLAYER_LOGIN_QUERY_LOADEQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = '{}' ORDER BY setindex", m_guid.GetCounter());
4836 if (!result)
4837 return;
4838
4839 uint32 count = 0;
4840 do
4841 {
4842 Field* fields = result->Fetch();
4843 EquipmentSet eqSet;
4844
4845 eqSet.Guid = fields[0].Get<uint64>();
4846 uint8 index = fields[1].Get<uint8>();
4847 eqSet.Name = fields[2].Get<std::string>();
4848 eqSet.IconName = fields[3].Get<std::string>();
4849 eqSet.IgnoreMask = fields[4].Get<uint32>();
4851
4852 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
4853 eqSet.Items[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].Get<uint32>());
4854
4855 m_EquipmentSets[index] = eqSet;
4856
4857 ++count;
4858
4859 if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit
4860 break;
4861 } while (result->NextRow());
4862}
std::uint64_t uint64
Definition Define.h:106
@ EQUIPMENT_SET_UNCHANGED
Definition Player.h:737
#define MAX_EQUIPMENT_SET_INDEX
Definition Player.h:755
@ EQUIPMENT_SLOT_END
Definition Player.h:689
EquipmentSets m_EquipmentSets
Definition Player.h:2930
Definition Player.h:744
ObjectGuid Items[EQUIPMENT_SLOT_END]
Definition Player.h:751
std::string Name
Definition Player.h:748
std::string IconName
Definition Player.h:749
EquipmentSetUpdateState state
Definition Player.h:752
uint64 Guid
Definition Player.h:747
uint32 IgnoreMask
Definition Player.h:750

References EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, Field::Get(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, MAX_EQUIPMENT_SET_INDEX, EquipmentSet::Name, and EquipmentSet::state.

Referenced by LoadFromDB().

◆ _LoadFriendList()

void Player::_LoadFriendList ( PreparedQueryResult  result)
protected

◆ _LoadGlyphAuras()

void Player::_LoadGlyphAuras ( )
protected
5790{
5791 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
5792 {
5793 if (uint32 glyph = GetGlyph(i))
5794 {
5795 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
5796 {
5797 if (GlyphSlotEntry const* glyphSlotEntry = sGlyphSlotStore.LookupEntry(GetGlyphSlot(i)))
5798 {
5799 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(glyphEntry->SpellId);
5800 if (glyphEntry->TypeFlags == glyphSlotEntry->TypeFlags)
5801 {
5802 if (!spellInfo->Stances)
5804 continue;
5805 }
5806 else
5807 LOG_ERROR("entities.player", "Player {} has glyph with typeflags {} in slot with typeflags {}, removing.", m_name, glyphEntry->TypeFlags, glyphSlotEntry->TypeFlags);
5808 }
5809 else
5810 LOG_ERROR("entities.player", "Player {} has not existing glyph slot entry {} on index {}", m_name, GetGlyphSlot(i), i);
5811 }
5812 else
5813 LOG_ERROR("entities.player", "Player {} has not existing glyph entry {} on index {}", m_name, glyph, i);
5814
5815 // On any error remove glyph
5816 SetGlyph(i, 0, true);
5817 }
5818 }
5819}
DBCStorage< GlyphSlotEntry > sGlyphSlotStore(GlyphSlotfmt)
DBCStorage< GlyphPropertiesEntry > sGlyphPropertiesStore(GlyphPropertiesfmt)
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ TRIGGERED_IGNORE_CASTER_AURASTATE
Will ignore shapeshift checks.
Definition SpellDefines.h:145
@ TRIGGERED_IGNORE_SHAPESHIFT
Will not adjust facing to target (if any)
Definition SpellDefines.h:144
uint32 GetGlyph(uint8 slot) const
Definition Player.h:1762
uint32 GetGlyphSlot(uint8 slot) const
Definition Player.h:1753
void SetGlyph(uint8 slot, uint32 glyph, bool save)
Definition Player.h:1754
std::string m_name
Definition Object.h:734
Definition DBCStructure.h:1022
Definition DBCStructure.h:1030

References Unit::CastSpell(), GetGlyph(), GetGlyphSlot(), LOG_ERROR, WorldObject::m_name, MAX_GLYPH_SLOT_INDEX, SetGlyph(), sGlyphPropertiesStore, sGlyphSlotStore, sSpellMgr, SpellInfo::Stances, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, and TRIGGERED_IGNORE_SHAPESHIFT.

Referenced by LoadFromDB().

◆ _LoadGlyphs()

void Player::_LoadGlyphs ( PreparedQueryResult  result)
protected
15076{
15077 // SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 from character_glyphs WHERE guid = '%u'
15078 if (!result)
15079 return;
15080
15081 do
15082 {
15083 Field* fields = result->Fetch();
15084
15085 uint8 spec = fields[0].Get<uint8>();
15086 if (spec >= m_specsCount)
15087 continue;
15088
15089 m_Glyphs[spec][0] = fields[1].Get<uint16>();
15090 m_Glyphs[spec][1] = fields[2].Get<uint16>();
15091 m_Glyphs[spec][2] = fields[3].Get<uint16>();
15092 m_Glyphs[spec][3] = fields[4].Get<uint16>();
15093 m_Glyphs[spec][4] = fields[5].Get<uint16>();
15094 m_Glyphs[spec][5] = fields[6].Get<uint16>();
15095 } while (result->NextRow());
15096}

References Field::Get(), m_Glyphs, and m_specsCount.

Referenced by LoadFromDB().

◆ _LoadGroup()

void Player::_LoadGroup ( )
protected
6495{
6496 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(GetGUID()))
6497 {
6498 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
6499 {
6500 if (group->GetMemberGroup(GetGUID()) <= MAX_RAID_SUBGROUPS)
6501 {
6502 if (group->IsLeader(GetGUID()))
6503 {
6505 }
6506
6507 uint8 subgroup = group->GetMemberGroup(GetGUID());
6508 SetGroup(group, subgroup);
6509
6510 // the group leader may change the instance difficulty while the player is offline
6511 SetDungeonDifficulty(group->GetDungeonDifficulty());
6512 SetRaidDifficulty(group->GetRaidDifficulty());
6513 }
6514 }
6515 }
6516
6517 if (!GetGroup() || !GetGroup()->IsLeader(GetGUID()))
6519}
#define sGroupMgr
Definition GroupMgr.h:51
#define MAX_RAID_SUBGROUPS
Definition Group.h:45
@ PLAYER_FLAGS_GROUP_LEADER
Definition Player.h:468
Definition Group.h:169
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1111
void RemovePlayerFlag(PlayerFlags flags)
Definition Player.h:1112
void SetDungeonDifficulty(Difficulty dungeon_difficulty)
Definition Player.h:1919
void SetGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:11573
void SetRaidDifficulty(Difficulty raid_difficulty)
Definition Player.h:1920
Group * GetGroup()
Definition Player.h:2472

References GetGroup(), Object::GetGUID(), MAX_RAID_SUBGROUPS, PLAYER_FLAGS_GROUP_LEADER, RemovePlayerFlag(), sCharacterCache, SetDungeonDifficulty(), SetGroup(), SetPlayerFlag(), SetRaidDifficulty(), and sGroupMgr.

Referenced by LoadFromDB().

◆ _LoadHomeBind()

bool Player::_LoadHomeBind ( PreparedQueryResult  result)
protected
7002{
7003 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
7004 if (!info)
7005 {
7006 LOG_ERROR("entities.player", "Player (Name {}) has incorrect race/class pair. Can't be loaded.", GetName());
7007 return false;
7008 }
7009
7010 bool ok = false;
7011 // SELECT mapId, zoneId, posX, posY, posZ FROM character_homebind WHERE guid = ?
7012 if (result)
7013 {
7014 Field* fields = result->Fetch();
7015
7016 m_homebindMapId = fields[0].Get<uint16>();
7017 m_homebindAreaId = fields[1].Get<uint16>();
7018 m_homebindX = fields[2].Get<float>();
7019 m_homebindY = fields[3].Get<float>();
7020 m_homebindZ = fields[4].Get<float>();
7021
7022 MapEntry const* bindMapEntry = sMapStore.LookupEntry(m_homebindMapId);
7023
7024 // accept saved data only for valid position (and non instanceable), and accessable
7026 !bindMapEntry->Instanceable() && GetSession()->Expansion() >= bindMapEntry->Expansion())
7027 ok = true;
7028 else
7029 {
7031 stmt->SetData(0, GetGUID().GetCounter());
7032 CharacterDatabase.Execute(stmt);
7033 }
7034 }
7035
7036 if (!ok)
7037 {
7038 m_homebindMapId = info->mapId;
7039 m_homebindAreaId = info->areaId;
7040 m_homebindX = info->positionX;
7041 m_homebindY = info->positionY;
7042 m_homebindZ = info->positionZ;
7043
7045 stmt->SetData(0, GetGUID().GetCounter());
7046 stmt->SetData(1, m_homebindMapId);
7047 stmt->SetData(2, m_homebindAreaId);
7048 stmt->SetData (3, m_homebindX);
7049 stmt->SetData (4, m_homebindY);
7050 stmt->SetData (5, m_homebindZ);
7051 CharacterDatabase.Execute(stmt);
7052 }
7053
7054 LOG_DEBUG("entities.player", "Setting player home position - mapid: {}, areaid: {}, X: {}, Y: {}, Z: {}",
7056 return true;
7057}
@ CHAR_INS_PLAYER_HOMEBIND
Definition CharacterDatabase.h:242
@ CHAR_DEL_PLAYER_HOMEBIND
Definition CharacterDatabase.h:244
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
static bool IsValidMapCoord(uint32 mapid, Position const &pos)
Definition MapMgr.h:90
LowType GetCounter() const
Definition ObjectGuid.h:145
uint8 getClass() const
Definition Unit.h:826
uint8 getRace(bool original=false) const
Definition Unit.cpp:20882
uint8 Expansion() const
Definition WorldSession.h:435
Definition DBCStructure.h:1326
Definition Player.h:331
float positionX
Definition Player.h:337
uint32 areaId
Definition Player.h:336
float positionY
Definition Player.h:338
float positionZ
Definition Player.h:339
uint32 mapId
Definition Player.h:335

References PlayerInfo::areaId, CHAR_DEL_PLAYER_HOMEBIND, CHAR_INS_PLAYER_HOMEBIND, CharacterDatabase, WorldSession::Expansion(), Field::Get(), Unit::getClass(), ObjectGuid::GetCounter(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), GetSession(), MapMgr::IsValidMapCoord(), LOG_DEBUG, LOG_ERROR, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PreparedStatementBase::SetData(), sMapStore, and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadInstanceTimeRestrictions()

void Player::_LoadInstanceTimeRestrictions ( PreparedQueryResult  result)
protected
15888{
15889 if (!result)
15890 return;
15891
15892 do
15893 {
15894 Field* fields = result->Fetch();
15895 _instanceResetTimes.insert(InstanceTimeMap::value_type(fields[0].Get<uint32>(), fields[1].Get<uint64>()));
15896 } while (result->NextRow());
15897}
InstanceTimeMap _instanceResetTimes
Definition Player.h:3002

References _instanceResetTimes.

Referenced by LoadFromDB().

◆ _LoadInventory()

void Player::_LoadInventory ( PreparedQueryResult  result,
uint32  timeDiff 
)
protected
5842{
5843 //QueryResult* result = CharacterDatabase.Query("SELECT data, text, bag, slot, item, item_template FROM character_inventory JOIN item_instance ON character_inventory.item = item_instance.guid WHERE character_inventory.guid = '{}' ORDER BY bag, slot", GetGUID().GetCounter());
5844 //NOTE: the "order by `bag`" is important because it makes sure
5845 //the bagMap is filled before items in the bags are loaded
5846 //NOTE2: the "order by `slot`" is needed because mainhand weapons are (wrongly?)
5847 //expected to be equipped before offhand items (TODO: fixme)
5848
5849 if (result)
5850 {
5851 uint32 zoneId = GetZoneId();
5852
5853 std::map<ObjectGuid::LowType, Bag*> bagMap; // fast guid lookup for bags
5854 std::map<ObjectGuid::LowType, Item*> invalidBagMap; // fast guid lookup for bags
5855 std::list<Item*> problematicItems;
5856 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
5857
5858 // Prevent items from being added to the queue while loading
5860 do
5861 {
5862 Field* fields = result->Fetch();
5863 if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields))
5864 {
5865 ObjectGuid::LowType bagGuid = fields[11].Get<uint32>();
5866 uint8 slot = fields[12].Get<uint8>();
5867
5868 uint8 err = EQUIP_ERR_OK;
5869 // Item is not in bag
5870 if (!bagGuid)
5871 {
5872 item->SetContainer(nullptr);
5873 item->SetSlot(slot);
5874
5876 {
5877 ItemPosCountVec dest;
5878 err = CanStoreItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false);
5879 if (err == EQUIP_ERR_OK)
5880 item = StoreItem(dest, item, true);
5881 }
5882 else if (IsEquipmentPos(INVENTORY_SLOT_BAG_0, slot))
5883 {
5884 uint16 dest;
5885 if (sScriptMgr->OnPlayerCheckItemInSlotAtLoadInventory(this, item, slot, err, dest))
5886 err = CanEquipItem(slot, dest, item, false, false);
5887 if (err == EQUIP_ERR_OK)
5888 QuickEquipItem(dest, item);
5889 }
5890 else if (IsBankPos(INVENTORY_SLOT_BAG_0, slot))
5891 {
5892 ItemPosCountVec dest;
5893 err = CanBankItem(INVENTORY_SLOT_BAG_0, slot, dest, item, false, false);
5894 if (err == EQUIP_ERR_OK)
5895 item = BankItem(dest, item, true);
5896 }
5897
5898 // Remember bags that may contain items in them
5899 if (err == EQUIP_ERR_OK)
5900 {
5901 if (IsBagPos(item->GetPos()))
5902 if (Bag* pBag = item->ToBag())
5903 bagMap[item->GetGUID().GetCounter()] = pBag;
5904 }
5905 else if (IsBagPos(item->GetPos()))
5906 if (item->IsBag())
5907 invalidBagMap[item->GetGUID().GetCounter()] = item;
5908 }
5909 else
5910 {
5911 item->SetSlot(NULL_SLOT);
5912 // Item is in the bag, find the bag
5913 std::map<ObjectGuid::LowType, Bag*>::iterator itr = bagMap.find(bagGuid);
5914 if (itr != bagMap.end())
5915 {
5916 ItemPosCountVec dest;
5917 err = CanStoreItem(itr->second->GetSlot(), slot, dest, item);
5918 if (err == EQUIP_ERR_OK)
5919 item = StoreItem(dest, item, true);
5920 }
5921 else if (invalidBagMap.find(bagGuid) != invalidBagMap.end())
5922 {
5923 std::map<ObjectGuid::LowType, Item*>::iterator iterator = invalidBagMap.find(bagGuid);
5924 if (std::find(problematicItems.begin(), problematicItems.end(), iterator->second) != problematicItems.end())
5925 {
5927 }
5928 }
5929 else
5930 {
5931 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which doesnt have a valid bag (Bag GUID: {}, slot: {}). Possible cheat?",
5932 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot);
5933 item->DeleteFromInventoryDB(trans);
5934 delete item;
5935 continue;
5936 }
5937 }
5938
5939 // Item's state may have changed after storing
5940 if (err == EQUIP_ERR_OK)
5941 item->SetState(ITEM_UNCHANGED, this);
5942 else
5943 {
5944 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) which can't be loaded into inventory (Bag GUID: {}, slot: {}) by reason {}. Item will be sent by mail.",
5945 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), bagGuid, slot, err);
5946 item->DeleteFromInventoryDB(trans);
5947 problematicItems.push_back(item);
5948 }
5949 }
5950 } while (result->NextRow());
5951
5953
5954 // Send problematic items by mail
5955 while (!problematicItems.empty())
5956 {
5957 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
5958
5959 MailDraft draft(subject, "There were problems with equipping item(s).");
5960 for (uint8 i = 0; !problematicItems.empty() && i < MAX_MAIL_ITEMS; ++i)
5961 {
5962 draft.AddItem(problematicItems.front());
5963 problematicItems.pop_front();
5964 }
5965 draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
5966 }
5967 CharacterDatabase.CommitTransaction(trans);
5968 }
5969 //if (IsAlive())
5971}
@ EQUIP_ERR_OK
Definition Item.h:47
@ EQUIP_ERR_INT_BAG_ERROR
Definition Item.h:87
@ ITEM_UNCHANGED
Definition Item.h:209
@ NULL_SLOT
Definition Item.h:41
@ LANG_NOT_EQUIPPED_ITEM
Definition Language.h:677
#define MAX_MAIL_ITEMS
Definition Mail.h:33
@ MAIL_CHECK_MASK_COPIED
This mail was returned. Do not allow returning mail back again.
Definition Mail.h:49
@ MAIL_STATIONERY_GM
Definition Mail.h:59
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:766
#define INVENTORY_SLOT_BAG_0
Definition Player.h:665
Definition Bag.h:28
Bag * ToBag()
Definition Item.h:250
uint32 LowType
Definition ObjectGuid.h:122
static bool IsEquipmentPos(uint16 pos)
Definition Player.h:1264
InventoryResult CanEquipItem(uint8 slot, uint16 &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition PlayerStorage.cpp:1806
void QuickEquipItem(uint16 pos, Item *pItem)
Definition PlayerStorage.cpp:2835
Item * BankItem(ItemPosCountVec const &dest, Item *pItem, bool update)
Definition Player.h:1333
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap=false) const
Definition Player.h:1284
Item * StoreItem(ItemPosCountVec const &pos, Item *pItem, bool update)
Definition PlayerStorage.cpp:2580
static bool IsInventoryPos(uint16 pos)
Definition Player.h:1262
Item * _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field *fields)
Definition PlayerStorage.cpp:5973
static bool IsBagPos(uint16 pos)
Definition PlayerStorage.cpp:591
InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, Item *pItem, bool swap, bool not_loading=true) const
Definition PlayerStorage.cpp:2038
static bool IsBankPos(uint16 pos)
Definition Player.h:1267
uint32 GetZoneId() const
Definition Object.cpp:3063
std::string GetAcoreString(uint32 entry) const
Definition WorldSession.cpp:833

References _ApplyAllItemMods(), _LoadItem(), MailDraft::AddItem(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CharacterDatabase, EQUIP_ERR_INT_BAG_ERROR, EQUIP_ERR_OK, Field::Get(), WorldSession::GetAcoreString(), Object::GetGUID(), WorldObject::GetName(), GetSession(), WorldObject::GetZoneId(), INVENTORY_SLOT_BAG_0, IsBagPos(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), ITEM_UNCHANGED, LANG_NOT_EQUIPPED_ITEM, LOG_ERROR, m_itemUpdateQueueBlocked, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MAX_MAIL_ITEMS, NULL_SLOT, QuickEquipItem(), MailDraft::SendMailTo(), sScriptMgr, StoreItem(), Item::ToBag(), ObjectGuid::ToString(), and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadItem()

Item * Player::_LoadItem ( CharacterDatabaseTransaction  trans,
uint32  zoneId,
uint32  timeDiff,
Field fields 
)
private
5974{
5975 Item* item = nullptr;
5976 ObjectGuid::LowType itemGuid = fields[13].Get<uint32>();
5977 uint32 itemEntry = fields[14].Get<uint32>();
5978 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry))
5979 {
5980 bool remove = false;
5981 item = NewItemOrBag(proto);
5982 if (item->LoadFromDB(itemGuid, GetGUID(), fields, itemEntry))
5983 {
5984 CharacterDatabasePreparedStatement* stmt = nullptr;
5985
5986 // Do not allow to have item limited to another map/zone in alive state
5987 if (IsAlive() && item->IsLimitedToAnotherMapOrZone(GetMapId(), zoneId))
5988 {
5989 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', map: {}) has item ({}, entry: {}) limited to another map ({}). Deleting item.",
5990 GetGUID().ToString(), GetName(), GetMapId(), item->GetGUID().ToString(), item->GetEntry(), zoneId);
5991 remove = true;
5992 }
5993 // "Conjured items disappear if you are logged out for more than 15 minutes"
5994 else if (timeDiff > 15 * MINUTE && proto->HasFlag(ITEM_FLAG_CONJURED))
5995 {
5996 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}', diff: {}) has conjured item ({}, entry: {}) with expired lifetime (15 minutes). Deleting item.",
5997 GetGUID().ToString(), GetName(), timeDiff, item->GetGUID().ToString(), item->GetEntry());
5998 remove = true;
5999 }
6000 else if (item->IsRefundable())
6001 {
6002 if (item->GetPlayedTime() > (2 * HOUR))
6003 {
6004 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with expired refund time ({}). Deleting refund data and removing refundable flag.",
6005 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry(), item->GetPlayedTime());
6006 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_REFUND_INSTANCE);
6007 stmt->SetData(0, item->GetGUID().GetCounter());
6008 trans->Append(stmt);
6009
6011 }
6012 else
6013 {
6014 // xinef: sync query
6015 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_REFUNDS);
6016 stmt->SetData(0, item->GetGUID().GetCounter());
6017 stmt->SetData(1, GetGUID().GetCounter());
6018 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6019 {
6020 item->SetRefundRecipient((*result)[0].Get<uint32>());
6021 item->SetPaidMoney((*result)[1].Get<uint32>());
6022 item->SetPaidExtendedCost((*result)[2].Get<uint16>());
6023 AddRefundReference(item->GetGUID());
6024 }
6025 else
6026 {
6027 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with refundable flags, but without data in item_refund_instance. Removing flag.",
6028 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6030 }
6031 }
6032 }
6033 else if (item->IsBOPTradable())
6034 {
6035 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ITEM_BOP_TRADE);
6036 stmt->SetData(0, item->GetGUID().GetCounter());
6037
6038 if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
6039 {
6040 AllowedLooterSet looters;
6041 for (std::string_view guidStr : Acore::Tokenize((*result)[0].Get<std::string_view>(), ' ', false))
6042 {
6043 if (Optional<ObjectGuid::LowType> guid = Acore::StringTo<ObjectGuid::LowType>(guidStr))
6044 {
6045 looters.insert(ObjectGuid::Create<HighGuid::Player>(*guid));
6046 }
6047 else
6048 {
6049 LOG_WARN("entities.player.loading", "Player::_LoadInventory: invalid item_soulbound_trade_data GUID '{}' for item {}. Skipped.", guidStr, item->GetGUID().ToString());
6050 }
6051 }
6052
6053 if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
6054 {
6055 item->SetSoulboundTradeable(looters);
6056 AddTradeableItem(item);
6057 }
6058 else
6059 item->ClearSoulboundTradeable(this);
6060 }
6061 else
6062 {
6063 LOG_DEBUG("entities.player.loading", "Player::_LoadInventory: player ({}, name: '{}') has item ({}, entry: {}) with ITEM_FIELD_FLAG_BOP_TRADEABLE flag, but without data in item_soulbound_trade_data. Removing flag.",
6064 GetGUID().ToString(), GetName(), item->GetGUID().ToString(), item->GetEntry());
6066 }
6067 }
6068 else if (proto->HolidayId)
6069 {
6070 remove = true;
6071 GameEventMgr::GameEventDataMap const& events = sGameEventMgr->GetEventMap();
6072 GameEventMgr::ActiveEvents const& activeEventsList = sGameEventMgr->GetActiveEventList();
6073 for (GameEventMgr::ActiveEvents::const_iterator itr = activeEventsList.begin(); itr != activeEventsList.end(); ++itr)
6074 {
6075 if (uint32(events[*itr].HolidayId) == proto->HolidayId)
6076 {
6077 remove = false;
6078 break;
6079 }
6080 }
6081 }
6082 }
6083 else
6084 {
6085 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has broken item (GUID: {}, entry: {}) in inventory. Deleting item.",
6086 GetGUID().ToString(), GetName(), itemGuid, itemEntry);
6087 remove = true;
6088 }
6089 // Remove item from inventory if necessary
6090 if (remove)
6091 {
6092 Item::DeleteFromInventoryDB(trans, itemGuid);
6093 item->FSetState(ITEM_REMOVED);
6094 item->SaveToDB(trans); // it also deletes item object!
6095 item = nullptr;
6096 }
6097 }
6098 else
6099 {
6100 LOG_ERROR("entities.player", "Player::_LoadInventory: player ({}, name: '{}') has unknown item (entry: {}) in inventory. Deleting item.",
6101 GetGUID().ToString(), GetName(), itemEntry);
6102 Item::DeleteFromInventoryDB(trans, itemGuid);
6103 Item::DeleteFromDB(trans, itemGuid);
6104 }
6105 return item;
6106}
Item * NewItemOrBag(ItemTemplate const *proto)
Definition Bag.h:67
@ CHAR_DEL_ITEM_REFUND_INSTANCE
Definition CharacterDatabase.h:376
@ CHAR_SEL_ITEM_BOP_TRADE
Definition CharacterDatabase.h:120
@ CHAR_SEL_ITEM_REFUNDS
Definition CharacterDatabase.h:119
constexpr auto HOUR
Definition Common.h:48
constexpr auto MINUTE
Definition Common.h:47
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
#define sGameEventMgr
Definition GameEventMgr.h:201
@ ITEM_FIELD_FLAG_REFUNDABLE
Definition ItemTemplate.h:121
@ ITEM_FIELD_FLAG_BOP_TRADEABLE
Definition ItemTemplate.h:117
@ ITEM_FLAG_CONJURED
Definition ItemTemplate.h:148
@ ITEM_REMOVED
Definition Item.h:212
#define LOG_WARN(filterType__,...)
Definition Log.h:162
GuidSet AllowedLooterSet
Definition LootMgr.h:151
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:24
@ ITEM_FIELD_FLAGS
Definition UpdateFields.h:42
events
Definition boss_sartura.cpp:43
std::vector< GameEventData > GameEventDataMap
Definition GameEventMgr.h:107
std::set< uint16 > ActiveEvents
Definition GameEventMgr.h:106
uint32 GetPlayedTime()
Definition Item.cpp:1246
static void DeleteFromInventoryDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:532
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field *fields, uint32 entry)
Definition Item.cpp:419
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:336
bool IsLimitedToAnotherMapOrZone(uint32 cur_mapId, uint32 cur_zoneId) const
Definition Item.cpp:1056
void SetSoulboundTradeable(AllowedLooterSet &allowedLooters)
Definition Item.cpp:1258
void SetPaidMoney(uint32 money)
Definition Item.h:345
bool IsSoulBound() const
Definition Item.h:236
bool IsBOPTradable() const
Definition Item.h:262
void SetRefundRecipient(ObjectGuid::LowType pGuidLow)
Definition Item.h:344
bool IsRefundable() const
Definition Item.h:261
void FSetState(ItemUpdateState state)
Definition Item.h:330
void SetPaidExtendedCost(uint32 iece)
Definition Item.h:346
void ClearSoulboundTradeable(Player *currentOwner)
Definition Item.cpp:1264
static void DeleteFromDB(CharacterDatabaseTransaction trans, ObjectGuid::LowType itemGuid)
Definition Item.cpp:518
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:849
uint32 GetEntry() const
Definition Object.h:116
void AddRefundReference(ObjectGuid itemGUID)
Definition Player.cpp:15625
void AddTradeableItem(Item *item)
Definition PlayerStorage.cpp:4131
bool IsAlive() const
Definition Unit.h:1748
uint32 GetMapId() const
Definition Position.h:281
Definition AsioHacksFwd.h:47
std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition Tokenize.cpp:20
STL namespace.
uint32 GetMaxStackSize() const
Definition ItemTemplate.h:727

References AddRefundReference(), AddTradeableItem(), CHAR_DEL_ITEM_REFUND_INSTANCE, CHAR_SEL_ITEM_BOP_TRADE, CHAR_SEL_ITEM_REFUNDS, CharacterDatabase, Item::ClearSoulboundTradeable(), Item::DeleteFromDB(), Item::DeleteFromInventoryDB(), Item::FSetState(), Field::Get(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldLocation::GetMapId(), ItemTemplate::GetMaxStackSize(), WorldObject::GetName(), Item::GetPlayedTime(), Item::GetTemplate(), HOUR, Unit::IsAlive(), Item::IsBOPTradable(), Item::IsLimitedToAnotherMapOrZone(), Item::IsRefundable(), Item::IsSoulBound(), ITEM_FIELD_FLAG_BOP_TRADEABLE, ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_CONJURED, ITEM_REMOVED, Item::LoadFromDB(), LOG_DEBUG, LOG_ERROR, LOG_WARN, MINUTE, NewItemOrBag(), Object::RemoveFlag(), Item::SaveToDB(), PreparedStatementBase::SetData(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), Item::SetSoulboundTradeable(), sGameEventMgr, sObjectMgr, Acore::Tokenize(), ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory().

◆ _LoadMail()

void Player::_LoadMail ( PreparedQueryResult  mailsResult,
PreparedQueryResult  mailItemsResult 
)
protected
6162{
6163 time_t cur_time = GameTime::GetGameTime().count();
6164
6165 m_mail.clear();
6166
6167 std::unordered_map<uint32, Mail*> mailById;
6168
6169 if (mailsResult)
6170 {
6171 do
6172 {
6173 Field* fields = mailsResult->Fetch();
6174 Mail* m = new Mail;
6175
6176 m->messageID = fields[0].Get<uint32>();
6177 m->messageType = fields[1].Get<uint8>();
6178 m->sender = fields[2].Get<uint32>();
6179 m->receiver = fields[3].Get<uint32>();
6180 m->subject = fields[4].Get<std::string>();
6181 m->body = fields[5].Get<std::string>();
6182 m->expire_time = time_t(fields[6].Get<uint32>());
6183 m->deliver_time = time_t(fields[7].Get<uint32>());
6184 m->money = fields[8].Get<uint32>();
6185 m->COD = fields[9].Get<uint32>();
6186 m->checked = fields[10].Get<uint8>();
6187 m->stationery = fields[11].Get<uint8>();
6188 m->mailTemplateId = fields[12].Get<int16>();
6189
6190 if (cur_time > m->expire_time)
6191 {
6192 LOG_DEBUG("entities.player", "Player::_LoadMail: Mail ({}) has expired - ignored.", m->messageID);
6193 continue;
6194 }
6195
6196 if (m->mailTemplateId && !sMailTemplateStore.LookupEntry(m->mailTemplateId))
6197 {
6198 LOG_ERROR("entities.player", "Player::_LoadMail: Mail ({}) has nonexistent MailTemplateId ({}), remove at load", m->messageID, m->mailTemplateId);
6199 m->mailTemplateId = 0;
6200 }
6201
6203
6204 m_mail.push_back(m);
6205 mailById[m->messageID] = m;
6206 } while (mailsResult->NextRow());
6207 }
6208
6209 if (mailItemsResult)
6210 {
6211 do
6212 {
6213 Field* fields = mailItemsResult->Fetch();
6214 uint32 mailId = fields[14].Get<uint32>();
6215 _LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
6216 } while (mailItemsResult->NextRow());
6217 }
6218
6220}
DBCStorage< MailTemplateEntry > sMailTemplateStore(MailTemplateEntryfmt)
std::int16_t int16
Definition Define.h:104
@ MAIL_STATE_UNCHANGED
Definition Mail.h:68
void UpdateNextMailTimeAndUnreads()
Definition PlayerUpdates.cpp:436
static Item * _LoadMailedItem(ObjectGuid const &playerGuid, Player *player, uint32 mailId, Mail *mail, Field *fields)
Definition PlayerStorage.cpp:6109
Definition Mail.h:167
ObjectGuid::LowType receiver
Definition Mail.h:173
uint8 messageType
Definition Mail.h:169
uint32 messageID
Definition Mail.h:168
time_t expire_time
Definition Mail.h:178
uint32 sender
Definition Mail.h:172
uint8 stationery
Definition Mail.h:170
std::string subject
Definition Mail.h:174
std::string body
Definition Mail.h:175
time_t deliver_time
Definition Mail.h:179
uint32 COD
Definition Mail.h:181
uint32 checked
Definition Mail.h:182
MailState state
Definition Mail.h:183
uint32 money
Definition Mail.h:180
uint16 mailTemplateId
Definition Mail.h:171

References _LoadMailedItem(), Mail::body, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), LOG_DEBUG, LOG_ERROR, m_mail, MAIL_STATE_UNCHANGED, Mail::mailTemplateId, Mail::messageID, Mail::messageType, Mail::money, Mail::receiver, Mail::sender, sMailTemplateStore, Mail::state, Mail::stationery, Mail::subject, and UpdateNextMailTimeAndUnreads().

Referenced by LoadFromDB().

◆ _LoadMailedItem()

Item * Player::_LoadMailedItem ( ObjectGuid const &  playerGuid,
Player player,
uint32  mailId,
Mail mail,
Field fields 
)
staticprotected
6110{
6111 ObjectGuid::LowType itemGuid = fields[11].Get<uint32>();
6112 uint32 itemEntry = fields[12].Get<uint32>();
6113
6114 ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemEntry);
6115 if (!proto)
6116 {
6117 LOG_ERROR("entities.player", "Player {} ({}) has unknown item in mailed items (GUID: {}, Entry: {}) in mail ({}), deleted.",
6118 player ? player->GetName() : "<unknown>", playerGuid.ToString(), itemGuid, itemEntry, mailId);
6119
6120 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
6121
6123 stmt->SetData(0, itemGuid);
6124 trans->Append(stmt);
6125
6126 CharacterDatabase.CommitTransaction(trans);
6127 return nullptr;
6128 }
6129
6130 Item* item = NewItemOrBag(proto);
6131
6132 ObjectGuid ownerGuid = fields[13].Get<uint32>() ? ObjectGuid::Create<HighGuid::Player>(fields[13].Get<uint32>()) : ObjectGuid::Empty;
6133 if (!item->LoadFromDB(itemGuid, ownerGuid, fields, itemEntry))
6134 {
6135 LOG_ERROR("entities.player", "Player::_LoadMailedItems: Item (GUID: {}) in mail ({}) doesn't exist, deleted from mail.", itemGuid, mailId);
6136
6138 stmt->SetData(0, itemGuid);
6139 CharacterDatabase.Execute(stmt);
6140
6141 item->FSetState(ITEM_REMOVED);
6142
6144 item->SaveToDB(temp);
6145 return nullptr;
6146 }
6147
6148 if (mail)
6149 {
6150 mail->AddItem(itemGuid, itemEntry);
6151 }
6152
6153 if (player)
6154 {
6155 player->AddMItem(item);
6156 }
6157
6158 return item;
6159}
@ CHAR_DEL_INVALID_MAIL_ITEM
Definition CharacterDatabase.h:113
@ CHAR_DEL_MAIL_ITEM
Definition CharacterDatabase.h:112
void AddMItem(Item *it)
Definition Player.h:1668
void AddItem(ObjectGuid::LowType itemGuidLow, uint32 item_template)
Definition Mail.h:185

References Mail::AddItem(), AddMItem(), CHAR_DEL_INVALID_MAIL_ITEM, CHAR_DEL_MAIL_ITEM, CharacterDatabase, ObjectGuid::Empty, Item::FSetState(), Field::Get(), WorldObject::GetName(), ITEM_REMOVED, Item::LoadFromDB(), LOG_ERROR, NewItemOrBag(), Item::SaveToDB(), PreparedStatementBase::SetData(), sObjectMgr, and ObjectGuid::ToString().

Referenced by _LoadMail(), and DeleteFromDB().

◆ _LoadMonthlyQuestStatus()

void Player::_LoadMonthlyQuestStatus ( PreparedQueryResult  result)
protected
6453{
6454 m_monthlyquests.clear();
6455
6456 if (result)
6457 {
6458 do
6459 {
6460 Field* fields = result->Fetch();
6461 uint32 quest_id = fields[0].Get<uint32>();
6462 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6463 if (!quest)
6464 continue;
6465
6466 m_monthlyquests.insert(quest_id);
6467 LOG_DEBUG("entities.player.loading", "Monthly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6468 } while (result->NextRow());
6469 }
6470
6471 m_MonthlyQuestChanged = false;
6472}
QuestSet m_monthlyquests
Definition Player.h:2709

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_MonthlyQuestChanged, m_monthlyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadPetStable()

void Player::_LoadPetStable ( uint8  petStableSlots,
PreparedQueryResult  result 
)
protected
15937{
15938 if (!petStableSlots && !result)
15939 return;
15940
15941 m_petStable = std::make_unique<PetStable>();
15942 m_petStable->MaxStabledPets = petStableSlots;
15943
15944 if (m_petStable->MaxStabledPets > MAX_PET_STABLES)
15945 {
15946 LOG_ERROR("entities.player", "Player::LoadFromDB: Player ({}) can't have more stable slots than {}, but has {} in DB",
15947 GetGUID().ToString(), MAX_PET_STABLES, m_petStable->MaxStabledPets);
15948
15949 m_petStable->MaxStabledPets = MAX_PET_STABLES;
15950 }
15951
15952 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
15953 // SELECT id, entry, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ?
15954 if (result)
15955 {
15956 do
15957 {
15958 Field* fields = result->Fetch();
15959 PetStable::PetInfo petInfo;
15960 petInfo.PetNumber = fields[0].Get<uint32>();
15961 petInfo.CreatureId = fields[1].Get<uint32>();
15962 petInfo.DisplayId = fields[2].Get<uint32>();
15963 petInfo.Level = fields[3].Get<uint16>();
15964 petInfo.Experience = fields[4].Get<uint32>();
15965 petInfo.ReactState = ReactStates(fields[5].Get<uint8>());
15966 PetSaveMode slot = PetSaveMode(fields[6].Get<uint8>());
15967 petInfo.Name = fields[7].Get<std::string>();
15968 petInfo.WasRenamed = fields[8].Get<bool>();
15969 petInfo.Health = fields[9].Get<uint32>();
15970 petInfo.Mana = fields[10].Get<uint32>();
15971 petInfo.Happiness = fields[11].Get<uint32>();
15972 petInfo.ActionBar = fields[12].Get<std::string>();
15973 petInfo.LastSaveTime = fields[13].Get<uint32>();
15974 petInfo.CreatedBySpellId = fields[14].Get<uint32>();
15975 petInfo.Type = PetType(fields[15].Get<uint8>());
15976
15977 if (slot == PET_SAVE_AS_CURRENT)
15978 m_petStable->CurrentPet = std::move(petInfo);
15979 else if (slot >= PET_SAVE_FIRST_STABLE_SLOT && slot <= PET_SAVE_LAST_STABLE_SLOT)
15980 m_petStable->StabledPets[slot - 1] = std::move(petInfo);
15981 else if (slot == PET_SAVE_NOT_IN_SLOT)
15982 m_petStable->UnslottedPets.push_back(std::move(petInfo));
15983
15984 } while (result->NextRow());
15985 }
15986}
PetSaveMode
Definition PetDefines.h:41
@ PET_SAVE_FIRST_STABLE_SLOT
Definition PetDefines.h:44
@ PET_SAVE_LAST_STABLE_SLOT
Definition PetDefines.h:45
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:46
@ PET_SAVE_AS_CURRENT
Definition PetDefines.h:43
PetType
Definition PetDefines.h:31
constexpr auto MAX_PET_STABLES
Definition PetDefines.h:37
ReactStates
Definition Unit.h:549
std::unique_ptr< PetStable > m_petStable
Definition Player.h:2989
Definition PetDefines.h:215
uint32 Mana
Definition PetDefines.h:225
uint32 Happiness
Definition PetDefines.h:226
uint32 CreatedBySpellId
Definition PetDefines.h:228
uint32 Health
Definition PetDefines.h:224
uint32 CreatureId
Definition PetDefines.h:221
bool WasRenamed
Definition PetDefines.h:232
uint8 Level
Definition PetDefines.h:229
uint32 DisplayId
Definition PetDefines.h:222
ReactStates ReactState
Definition PetDefines.h:230
std::string Name
Definition PetDefines.h:218
PetType Type
Definition PetDefines.h:231
uint32 Experience
Definition PetDefines.h:223
uint32 PetNumber
Definition PetDefines.h:220
uint32 LastSaveTime
Definition PetDefines.h:227
std::string ActionBar
Definition PetDefines.h:219

References PetStable::PetInfo::ActionBar, PetStable::PetInfo::CreatedBySpellId, PetStable::PetInfo::CreatureId, PetStable::PetInfo::DisplayId, PetStable::PetInfo::Experience, Field::Get(), Object::GetGUID(), PetStable::PetInfo::Happiness, PetStable::PetInfo::Health, PetStable::PetInfo::LastSaveTime, PetStable::PetInfo::Level, LOG_ERROR, m_petStable, PetStable::PetInfo::Mana, MAX_PET_STABLES, PetStable::PetInfo::Name, PET_SAVE_AS_CURRENT, PET_SAVE_FIRST_STABLE_SLOT, PET_SAVE_LAST_STABLE_SLOT, PET_SAVE_NOT_IN_SLOT, PetStable::PetInfo::PetNumber, PetStable::PetInfo::ReactState, Position::ToString(), PetStable::PetInfo::Type, and PetStable::PetInfo::WasRenamed.

Referenced by LoadFromDB().

◆ _LoadQuestStatus()

void Player::_LoadQuestStatus ( PreparedQueryResult  result)
protected
6235{
6236 uint16 slot = 0;
6237
6239 //QueryResult* result = CharacterDatabase.Query("SELECT quest, status, explored, timer, mobcount1, mobcount2, mobcount3, mobcount4, itemcount1, itemcount2, itemcount3,
6240 // 11 12 13 14
6241 // itemcount4, itemcount5, itemcount6, playercount FROM character_queststatus WHERE guid = '{}'", GetGUID().GetCounter());
6242
6243 if (result)
6244 {
6245 do
6246 {
6247 Field* fields = result->Fetch();
6248
6249 uint32 quest_id = fields[0].Get<uint32>();
6250 // used to be new, no delete?
6251 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6252 if (quest)
6253 {
6254 // find or create
6255 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
6256
6257 uint8 qstatus = fields[1].Get<uint8>();
6258 if (qstatus < MAX_QUEST_STATUS)
6259 questStatusData.Status = QuestStatus(qstatus);
6260 else
6261 {
6262 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
6263 LOG_ERROR("entities.player", "Player {} ({}) has invalid quest {} status ({}), replaced by QUEST_STATUS_INCOMPLETE(3).",
6264 GetName(), GetGUID().ToString(), quest_id, qstatus);
6265 }
6266
6267 questStatusData.Explored = (fields[2].Get<uint8>() > 0);
6268
6269 time_t quest_time = time_t(fields[3].Get<uint32>());
6270
6271 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && !GetQuestRewardStatus(quest_id))
6272 {
6273 AddTimedQuest(quest_id);
6274
6275 if (quest_time <= GameTime::GetGameTime().count())
6276 questStatusData.Timer = 1;
6277 else
6278 questStatusData.Timer = uint32((quest_time - GameTime::GetGameTime().count()) * IN_MILLISECONDS);
6279 }
6280 else
6281 quest_time = 0;
6282
6283 for (uint32 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
6284 questStatusData.CreatureOrGOCount[i] = fields[4 + i].Get<uint16>();
6285
6286 for (uint32 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
6287 questStatusData.ItemCount[i] = fields[8 + i].Get<uint16>();
6288
6289 questStatusData.PlayerCount = fields[14].Get<uint16>();
6290
6291 // add to quest log
6292 if (slot < MAX_QUEST_LOG_SIZE && questStatusData.Status != QUEST_STATUS_NONE)
6293 {
6294 SetQuestSlot(slot, quest_id, uint32(quest_time)); // cast can't be helped
6295
6296 if (questStatusData.Status == QUEST_STATUS_COMPLETE)
6298 else if (questStatusData.Status == QUEST_STATUS_FAILED)
6300
6301 for (uint8 idx = 0; idx < QUEST_OBJECTIVES_COUNT; ++idx)
6302 if (questStatusData.CreatureOrGOCount[idx])
6303 SetQuestSlotCounter(slot, idx, questStatusData.CreatureOrGOCount[idx]);
6304
6305 if (questStatusData.PlayerCount)
6306 SetQuestSlotCounter(slot, QUEST_PVP_KILL_SLOT, questStatusData.PlayerCount);
6307
6308 ++slot;
6309 }
6310
6311 LOG_DEBUG("entities.player.loading", "Quest status is {{}} for quest {{}} for player ({})", questStatusData.Status, quest_id, GetGUID().ToString());
6312 }
6313 } while (result->NextRow());
6314 }
6315
6316 // clear quest log tail
6317 for (uint16 i = slot; i < MAX_QUEST_LOG_SIZE; ++i)
6318 SetQuestSlot(i, 0);
6319}
@ QUEST_STATE_COMPLETE
Definition Player.h:628
@ QUEST_STATE_FAIL
Definition Player.h:629
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition QuestDef.h:35
#define MAX_QUEST_LOG_SIZE
Definition QuestDef.h:33
#define QUEST_PVP_KILL_SLOT
Definition QuestDef.h:43
QuestStatus
Definition QuestDef.h:99
@ QUEST_STATUS_FAILED
Definition QuestDef.h:105
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:103
@ QUEST_STATUS_NONE
Definition QuestDef.h:100
@ MAX_QUEST_STATUS
Definition QuestDef.h:107
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:101
@ QUEST_SPECIAL_FLAGS_TIMED
Definition QuestDef.h:178
QuestStatusMap m_QuestStatus
Definition Player.h:2808
bool GetQuestRewardStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1415
void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
Definition Player.h:1494
void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer=0)
Definition Player.h:1486
void SetQuestSlotState(uint16 slot, uint32 state)
Definition Player.h:1501
void AddTimedQuest(uint32 quest_id)
Definition Player.h:1553
Definition QuestDef.h:407
uint32 Timer
Definition QuestDef.h:415
uint16 PlayerCount
Definition QuestDef.h:418
uint16 ItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:416
QuestStatus Status
Definition QuestDef.h:414
bool Explored
Definition QuestDef.h:419
uint16 CreatureOrGOCount[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:417

References AddTimedQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), WorldObject::GetName(), GetQuestRewardStatus(), IN_MILLISECONDS, QuestStatusData::ItemCount, LOG_DEBUG, LOG_ERROR, m_QuestStatus, MAX_QUEST_LOG_SIZE, MAX_QUEST_STATUS, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_PVP_KILL_SLOT, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_COMPLETE, QUEST_STATE_FAIL, QUEST_STATUS_COMPLETE, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SetQuestSlot(), SetQuestSlotCounter(), SetQuestSlotState(), sObjectMgr, QuestStatusData::Status, QuestStatusData::Timer, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadQuestStatusRewarded()

void Player::_LoadQuestStatusRewarded ( PreparedQueryResult  result)
protected
6322{
6323 // SELECT quest FROM character_queststatus_rewarded WHERE guid = ?
6324
6325 if (result)
6326 {
6327 m_RewardedQuests.rehash(result->GetRowCount());
6328 do
6329 {
6330 Field* fields = result->Fetch();
6331
6332 uint32 quest_id = fields[0].Get<uint32>();
6333 // used to be new, no delete?
6334 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6335 if (quest)
6336 {
6337 // learn rewarded spell if unknown
6339
6340 // set rewarded title if any
6341 if (quest->GetCharTitleId())
6342 {
6343 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
6344 SetTitle(titleEntry);
6345 }
6346
6347 if (quest->GetBonusTalents())
6348 m_questRewardTalentCount += quest->GetBonusTalents();
6349 }
6350
6351 m_RewardedQuests.insert(quest_id);
6352 } while (result->NextRow());
6353 }
6354}
DBCStorage< CharTitlesEntry > sCharTitlesStore(CharTitlesEntryfmt)
RewardedQuestSet m_RewardedQuests
Definition Player.h:2811
void SetTitle(CharTitlesEntry const *title, bool lost=false)
Definition Player.cpp:13382
void learnQuestRewardedSpells()
Definition Player.cpp:12029
Definition DBCStructure.h:632

References Field::Get(), learnQuestRewardedSpells(), m_questRewardTalentCount, m_RewardedQuests, sCharTitlesStore, SetTitle(), and sObjectMgr.

Referenced by LoadFromDB().

◆ _LoadRandomBGStatus()

void Player::_LoadRandomBGStatus ( PreparedQueryResult  result)
protected
15835{
15836 if (result)
15837 m_IsBGRandomWinner = true;
15838}

References m_IsBGRandomWinner.

Referenced by LoadFromDB().

◆ _LoadSeasonalQuestStatus()

void Player::_LoadSeasonalQuestStatus ( PreparedQueryResult  result)
protected
6430{
6431 m_seasonalquests.clear();
6432
6433 if (result)
6434 {
6435 do
6436 {
6437 Field* fields = result->Fetch();
6438 uint32 quest_id = fields[0].Get<uint32>();
6439 uint32 event_id = fields[1].Get<uint32>();
6440 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6441 if (!quest)
6442 continue;
6443
6444 m_seasonalquests[event_id].insert(quest_id);
6445 LOG_DEBUG("entities.player.loading", "Seasonal quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6446 } while (result->NextRow());
6447 }
6448
6449 m_SeasonalQuestChanged = false;
6450}
SeasonalEventQuestMap m_seasonalquests
Definition Player.h:2710

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_SeasonalQuestChanged, m_seasonalquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSkills()

void Player::_LoadSkills ( PreparedQueryResult  result)
protected
13720{
13721 // 0 1 2
13722 // SetQuery(PLAYER_LOGIN_QUERY_LOADSKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = '{}'", m_guid.GetCounter());
13723
13724 uint32 count = 0;
13725 std::unordered_map<uint32, uint32> loadedSkillValues;
13726 if (result)
13727 {
13728 do
13729 {
13730 Field* fields = result->Fetch();
13731 uint16 skill = fields[0].Get<uint16>();
13732 uint16 value = fields[1].Get<uint16>();
13733 uint16 max = fields[2].Get<uint16>();
13734
13735 SkillRaceClassInfoEntry const* rcEntry = GetSkillRaceClassInfo(skill, getRace(), getClass());
13736 if (!rcEntry)
13737 {
13738 LOG_ERROR("entities.player", "Player {} (GUID: {}), has skill ({}) that is invalid for the race/class combination (Race: {}, Class: {}). Will be deleted.",
13739 GetName(), GetGUID().GetCounter(), skill, getRace(), getClass());
13740
13741 // Mark skill for deletion in the database
13742 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(0, SKILL_DELETED)));
13743 continue;
13744 }
13745
13746 // set fixed skill ranges
13747 switch (GetSkillRangeType(rcEntry))
13748 {
13749 case SKILL_RANGE_LANGUAGE: // 300..300
13750 value = max = 300;
13751 break;
13752 case SKILL_RANGE_MONO: // 1..1, grey monolite bar
13753 value = max = 1;
13754 break;
13755 case SKILL_RANGE_LEVEL:
13757 default:
13758 break;
13759 }
13760
13761 if (value == 0)
13762 {
13763 LOG_ERROR("entities.player", "Player {} (GUID: {}), has skill ({}) with value 0. Will be deleted.",
13764 GetName(), GetGUID().GetCounter(), skill);
13765
13767
13768 stmt->SetData(0, GetGUID().GetCounter());
13769 stmt->SetData(1, skill);
13770
13771 CharacterDatabase.Execute(stmt);
13772
13773 continue;
13774 }
13775
13776 uint16 skillStep = 0;
13777 if (SkillTiersEntry const* skillTier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID))
13778 {
13779 for (uint32 i = 0; i < MAX_SKILL_STEP; ++i)
13780 {
13781 if (skillTier->Value[skillStep] == max)
13782 {
13783 skillStep = i + 1;
13784 break;
13785 }
13786 }
13787 }
13788
13789 SetUInt32Value(PLAYER_SKILL_INDEX(count), MAKE_PAIR32(skill, skillStep));
13790
13793
13794 mSkillStatus.insert(SkillStatusMap::value_type(skill, SkillStatusData(count, SKILL_UNCHANGED)));
13795
13796 loadedSkillValues[skill] = value;
13797
13798 ++count;
13799
13800 if (count >= PLAYER_MAX_SKILLS) // client limit
13801 {
13802 LOG_ERROR("entities.player", "Character {} has more than {} skills.", GetGUID().ToString(), PLAYER_MAX_SKILLS);
13803 break;
13804 }
13805 } while (result->NextRow());
13806 }
13807
13808 // Learn skill rewarded spells after all skills have been loaded to prevent learning a skill from them before its loaded with proper value from DB
13809 for (auto& skill : loadedSkillValues)
13810 {
13811 learnSkillRewardedSpells(skill.first, skill.second);
13812 }
13813
13814 for (; count < PLAYER_MAX_SKILLS; ++count)
13815 {
13819 }
13820}
@ CHAR_DEL_CHARACTER_SKILL
Definition CharacterDatabase.h:318
SkillRaceClassInfoEntry const * GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_)
Definition DBCStores.cpp:895
DBCStorage< SkillTiersEntry > sSkillTiersStore(SkillTiersfmt)
#define MAX_SKILL_STEP
Definition DBCStructure.h:1581
uint32 MAKE_PAIR32(uint16 l, uint16 h)
Definition ObjectDefines.h:88
SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const *rcEntry)
Definition ObjectMgr.cpp:9084
@ SKILL_RANGE_MONO
Definition ObjectMgr.h:675
@ SKILL_RANGE_LANGUAGE
Definition ObjectMgr.h:673
@ SKILL_RANGE_LEVEL
Definition ObjectMgr.h:674
#define PLAYER_SKILL_BONUS_INDEX(x)
Definition Player.h:81
#define PLAYER_SKILL_VALUE_INDEX(x)
Definition Player.h:80
#define PLAYER_SKILL_INDEX(x)
Definition Player.h:79
#define PLAYER_MAX_SKILLS
Definition Player.h:71
@ SKILL_DELETED
Definition Player.h:637
@ SKILL_UNCHANGED
Definition Player.h:634
#define MAKE_SKILL_VALUE(v, m)
Definition Player.h:85
SkillStatusMap mSkillStatus
Definition Player.h:2815
void learnSkillRewardedSpells(uint32 id, uint32 value)
Definition Player.cpp:12042
Definition DBCStructure.h:1570
Definition Player.h:641
Definition DBCStructure.h:1616

References CHAR_DEL_CHARACTER_SKILL, CharacterDatabase, Field::Get(), Unit::getClass(), Object::GetGUID(), GetMaxSkillValueForLevel(), WorldObject::GetName(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, MAX_SKILL_STEP, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), Unit::SetUInt32Value(), SKILL_DELETED, SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_UNCHANGED, sSkillTiersStore, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpellCooldowns()

void Player::_LoadSpellCooldowns ( PreparedQueryResult  result)
3600{
3601 // some cooldowns can be already set at aura loading...
3602
3603 //QueryResult* result = CharacterDatabase.Query("SELECT spell, category, item, time FROM character_spell_cooldown WHERE guid = '{}'", GetGUID().GetCounter()());
3604
3605 if (result)
3606 {
3607 time_t curTime = GameTime::GetGameTime().count();
3608
3609 do
3610 {
3611 Field* fields = result->Fetch();
3612 uint32 spell_id = fields[0].Get<uint32>();
3613 uint16 category = fields[1].Get<uint16>();
3614 uint32 item_id = fields[2].Get<uint32>();
3615 uint32 db_time = fields[3].Get<uint32>();
3616 bool needSend = fields[4].Get<bool>();
3617
3618 if (!sSpellMgr->GetSpellInfo(spell_id))
3619 {
3620 LOG_ERROR("entities.player", "Player {} has unknown spell {} in `character_spell_cooldown`, skipping.", GetGUID().ToString(), spell_id);
3621 continue;
3622 }
3623
3624 // skip outdated cooldown
3625 if (db_time <= curTime)
3626 continue;
3627
3628 _AddSpellCooldown(spell_id, category, item_id, (db_time - curTime) * IN_MILLISECONDS, needSend);
3629
3630 LOG_DEBUG("entities.player.loading", "Player ({}) spell {}, item {} cooldown loaded ({} secs).", GetGUID().ToString(), spell_id, item_id, uint32(db_time - curTime));
3631 } while (result->NextRow());
3632 }
3633}
void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Player.cpp:11085

References _AddSpellCooldown(), Field::Get(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, LOG_DEBUG, LOG_ERROR, sSpellMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _LoadSpells()

void Player::_LoadSpells ( PreparedQueryResult  result)
protected
6475{
6476 //QueryResult* result = CharacterDatabase.Query("SELECT spell, specMask FROM character_spell WHERE guid = '{}'", GetGUID().GetCounter());
6477
6478 if (result)
6479 {
6480 do
6481 {
6482 Field* fields = result->Fetch();
6483 uint32 spellId = fields[0].Get<uint32>();
6484 uint8 specMask = fields[1].Get<uint8>();
6485
6486 if (CheckSkillLearnedBySpell(spellId))
6487 addSpell(spellId, specMask, true);
6488 else
6489 removeSpell(spellId, SPEC_MASK_ALL, false);
6490 } while (result->NextRow());
6491 }
6492}
void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary)
Definition Player.cpp:3344
bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary=false, bool learnFromSkill=false)
Definition Player.cpp:3049
bool CheckSkillLearnedBySpell(uint32 spellId)
Definition Player.cpp:3096

References addSpell(), CheckSkillLearnedBySpell(), Field::Get(), removeSpell(), and SPEC_MASK_ALL.

Referenced by LoadFromDB().

◆ _LoadTalents()

void Player::_LoadTalents ( PreparedQueryResult  result)
protected
15125{
15126 // SetQuery(PLAYER_LOGIN_QUERY_LOADTALENTS, "SELECT spell, specMask FROM character_talent WHERE guid = '{}'", m_guid.GetCounter());
15127 if (result)
15128 {
15129 do
15130 {
15131 // xinef: checked
15132 uint32 spellId = (*result)[0].Get<uint32>();
15133 uint8 specMask = (*result)[1].Get<uint8>();
15134 addTalent(spellId, specMask, 0);
15135 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
15136 ASSERT(talentPos);
15137
15138 } while (result->NextRow());
15139 }
15140}
TalentSpellPos const * GetTalentSpellPos(uint32 spellId)
Definition DBCStores.cpp:677
#define ASSERT
Definition Errors.h:68
bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank)
Definition Player.cpp:2898
Definition DBCStructure.h:2233

References addTalent(), ASSERT, and GetTalentSpellPos().

Referenced by LoadFromDB().

◆ _LoadWeeklyQuestStatus()

void Player::_LoadWeeklyQuestStatus ( PreparedQueryResult  result)
protected
6408{
6409 m_weeklyquests.clear();
6410
6411 if (result)
6412 {
6413 do
6414 {
6415 Field* fields = result->Fetch();
6416 uint32 quest_id = fields[0].Get<uint32>();
6417 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
6418 if (!quest)
6419 continue;
6420
6421 m_weeklyquests.insert(quest_id);
6422 LOG_DEBUG("entities.player.loading", "Weekly quest {{}} cooldown for player ({})", quest_id, GetGUID().ToString());
6423 } while (result->NextRow());
6424 }
6425
6426 m_WeeklyQuestChanged = false;
6427}
QuestSet m_weeklyquests
Definition Player.h:2708

References Field::Get(), Object::GetGUID(), LOG_DEBUG, m_WeeklyQuestChanged, m_weeklyquests, sObjectMgr, and Position::ToString().

Referenced by LoadFromDB().

◆ _RemoveAllItemMods()

void Player::_RemoveAllItemMods ( )
7570{
7571 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods start.");
7572
7573 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7574 {
7575 if (m_items[i])
7576 {
7577 ItemTemplate const* proto = m_items[i]->GetTemplate();
7578 if (!proto)
7579 continue;
7580
7581 // item set bonuses not dependent from item broken state
7582 if (proto->ItemSet)
7583 RemoveItemsSetItem(this, proto);
7584
7585 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7586 continue;
7587
7588 ApplyItemEquipSpell(m_items[i], false);
7589 ApplyEnchantment(m_items[i], false);
7590 }
7591 }
7592
7593 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
7594 {
7595 if (m_items[i])
7596 {
7597 if (m_items[i]->IsBroken() || !CanUseAttackType(GetAttackBySlot(i)))
7598 continue;
7599 ItemTemplate const* proto = m_items[i]->GetTemplate();
7600 if (!proto)
7601 continue;
7602
7604 if (attacktype < MAX_ATTACK)
7605 _ApplyWeaponDependentAuraMods(m_items[i], attacktype, false);
7606
7607 _ApplyItemBonuses(proto, i, false);
7608
7609 if (i == EQUIPMENT_SLOT_RANGED)
7611 }
7612 }
7613
7614 LOG_DEBUG("entities.player.items", "_RemoveAllItemMods complete.");
7615}
void RemoveItemsSetItem(Player *player, ItemTemplate const *proto)
Definition Item.cpp:118

References _ApplyAmmoBonuses(), _ApplyItemBonuses(), _ApplyWeaponDependentAuraMods(), ApplyEnchantment(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), EQUIPMENT_SLOT_RANGED, GetAttackBySlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_END, ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_ATTACK, and RemoveItemsSetItem().

Referenced by _RemoveAllStatBonuses().

◆ _RemoveAllStatBonuses()

void Player::_RemoveAllStatBonuses ( )
1021{
1022 SetCanModifyStats(false);
1023
1026
1027 SetCanModifyStats(true);
1028
1030}
void _RemoveAllItemMods()
Definition Player.cpp:7569
void _RemoveAllAuraStatMods()
Definition Unit.cpp:5550

References Unit::_RemoveAllAuraStatMods(), _RemoveAllItemMods(), Unit::SetCanModifyStats(), and UpdateAllStats().

Referenced by InitStatsForLevel().

◆ _removeTalent() [1/2]

void Player::_removeTalent ( PlayerTalentMap::iterator &  itr,
uint8  specMask 
)
2969{
2970 // xinef: remove spec mask from iterator
2971 itr->second->specMask &= ~specMask;
2972
2973 // xinef: if talent is not present in any spec - remove
2974 if (itr->second->specMask == 0)
2975 {
2976 if (itr->second->State == PLAYERSPELL_NEW)
2977 {
2978 delete itr->second;
2979 m_talents.erase(itr);
2980 return;
2981 }
2982 else
2983 itr->second->State = PLAYERSPELL_REMOVED;
2984 }
2985 // xinef: otherwise save changes to DB
2986 else if (itr->second->State != PLAYERSPELL_NEW)
2987 itr->second->State = PLAYERSPELL_CHANGED;
2988}

References m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, and PLAYERSPELL_REMOVED.

Referenced by _removeTalent(), addTalent(), and resetTalents().

◆ _removeTalent() [2/2]

void Player::_removeTalent ( uint32  spellId,
uint8  specMask 
)
2960{
2961 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2962 if (itr == m_talents.end() || itr->second->State == PLAYERSPELL_REMOVED)
2963 return;
2964
2965 _removeTalent(itr, specMask);
2966}
void _removeTalent(PlayerTalentMap::iterator &itr, uint8 specMask)
Definition Player.cpp:2968

References _removeTalent(), m_talents, and PLAYERSPELL_REMOVED.

◆ _removeTalentAurasAndSpells()

void Player::_removeTalentAurasAndSpells ( uint32  spellId)
2991{
2992 RemoveOwnedAura(spellId);
2993
2994 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2995 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
2996 {
2997 // pussywizard: remove pet auras
2998 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spellId, i))
2999 RemovePetAura(petSpell);
3000
3001 // pussywizard: remove all triggered auras
3002 if (spellInfo->Effects[i].TriggerSpell > 0)
3003 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3004
3005 // xinef: remove temporary spells added by talent
3006 // xinef: recursively remove all learnt spells
3007 if (spellInfo->Effects[i].TriggerSpell > 0 && spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3008 {
3009 removeSpell(spellInfo->Effects[i].TriggerSpell, SPEC_MASK_ALL, true);
3010 _removeTalentAurasAndSpells(spellInfo->Effects[i].TriggerSpell);
3011 }
3012 }
3013}
Definition SpellMgr.h:470
void _removeTalentAurasAndSpells(uint32 spellId)
Definition Player.cpp:2990
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4773
void RemovePetAura(PetAura const *petSpell)
Definition Unit.cpp:17335
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4977

References _removeTalentAurasAndSpells(), SpellInfo::Effects, MAX_SPELL_EFFECTS, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SPEC_MASK_ALL, SPELL_EFFECT_LEARN_SPELL, and sSpellMgr.

Referenced by _removeTalentAurasAndSpells(), ActivateSpec(), addTalent(), and resetTalents().

◆ _SaveActions()

void Player::_SaveActions ( CharacterDatabaseTransaction  trans)
protected
7149{
7150 CharacterDatabasePreparedStatement* stmt = nullptr;
7151
7152 for (ActionButtonList::iterator itr = m_actionButtons.begin(); itr != m_actionButtons.end();)
7153 {
7154 switch (itr->second.uState)
7155 {
7156 case ACTIONBUTTON_NEW:
7157 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
7158 stmt->SetData(0, GetGUID().GetCounter());
7159 stmt->SetData(1, m_activeSpec);
7160 stmt->SetData(2, itr->first);
7161 stmt->SetData(3, itr->second.GetAction());
7162 stmt->SetData(4, uint8(itr->second.GetType()));
7163 trans->Append(stmt);
7164
7165 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7166 ++itr;
7167 break;
7169 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACTION);
7170 stmt->SetData(0, itr->second.GetAction());
7171 stmt->SetData(1, uint8(itr->second.GetType()));
7172 stmt->SetData(2, GetGUID().GetCounter());
7173 stmt->SetData(3, itr->first);
7174 stmt->SetData(4, m_activeSpec);
7175 trans->Append(stmt);
7176
7177 itr->second.uState = ACTIONBUTTON_UNCHANGED;
7178 ++itr;
7179 break;
7181 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC);
7182 stmt->SetData(0, GetGUID().GetCounter());
7183 stmt->SetData(1, itr->first);
7184 stmt->SetData(2, m_activeSpec);
7185 trans->Append(stmt);
7186
7187 m_actionButtons.erase(itr++);
7188 break;
7189 default:
7190 ++itr;
7191 break;
7192 }
7193 }
7194}
@ CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC
Definition CharacterDatabase.h:434
@ CHAR_UPD_CHAR_ACTION
Definition CharacterDatabase.h:433
@ CHAR_INS_CHAR_ACTION
Definition CharacterDatabase.h:432
@ ACTIONBUTTON_NEW
Definition Player.h:225
@ ACTIONBUTTON_CHANGED
Definition Player.h:224

References ACTIONBUTTON_CHANGED, ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, ACTIONBUTTON_UNCHANGED, CHAR_DEL_CHAR_ACTION_BY_BUTTON_SPEC, CHAR_INS_CHAR_ACTION, CHAR_UPD_CHAR_ACTION, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_actionButtons, m_activeSpec, and PreparedStatementBase::SetData().

Referenced by ActivateSpec(), SaveToDB(), and UpdateSpecCount().

◆ _SaveAuras()

void Player::_SaveAuras ( CharacterDatabaseTransaction  trans,
bool  logout 
)
protected
7197{
7199 stmt->SetData(0, GetGUID().GetCounter());
7200 trans->Append(stmt);
7201
7202 for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
7203 {
7204 if (!itr->second->CanBeSaved())
7205 continue;
7206
7207 Aura* aura = itr->second;
7208 if (!logout && aura->GetDuration() < 60 * IN_MILLISECONDS )
7209 continue;
7210
7211 int32 damage[MAX_SPELL_EFFECTS];
7212 int32 baseDamage[MAX_SPELL_EFFECTS];
7213 uint8 effMask = 0;
7214 uint8 recalculateMask = 0;
7215 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
7216 {
7217 if (AuraEffect const* effect = aura->GetEffect(i))
7218 {
7219 baseDamage[i] = effect->GetBaseAmount();
7220 damage[i] = effect->GetAmount();
7221 effMask |= 1 << i;
7222 if (effect->CanBeRecalculated())
7223 recalculateMask |= 1 << i;
7224 }
7225 else
7226 {
7227 baseDamage[i] = 0;
7228 damage[i] = 0;
7229 }
7230 }
7231
7232 uint8 index = 0;
7233 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
7234 stmt->SetData(index++, GetGUID().GetCounter());
7235 stmt->SetData(index++, itr->second->GetCasterGUID().GetRawValue());
7236 stmt->SetData(index++, itr->second->GetCastItemGUID().GetRawValue());
7237 stmt->SetData(index++, itr->second->GetId());
7238 stmt->SetData(index++, effMask);
7239 stmt->SetData(index++, recalculateMask);
7240 stmt->SetData(index++, itr->second->GetStackAmount());
7241 stmt->SetData(index++, damage[0]);
7242 stmt->SetData(index++, damage[1]);
7243 stmt->SetData(index++, damage[2]);
7244 stmt->SetData(index++, baseDamage[0]);
7245 stmt->SetData(index++, baseDamage[1]);
7246 stmt->SetData(index++, baseDamage[2]);
7247 stmt->SetData(index++, itr->second->GetMaxDuration());
7248 stmt->SetData(index++, itr->second->GetDuration());
7249 stmt->SetData(index, itr->second->GetCharges());
7250 trans->Append(stmt);
7251 }
7252}
@ CHAR_INS_AURA
Definition CharacterDatabase.h:196
@ CHAR_DEL_CHAR_AURA
Definition CharacterDatabase.h:409
Definition SpellAuraEffects.h:39
int32 GetDuration() const
Definition SpellAuras.h:133
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:175
AuraMap m_ownedAuras
Definition Unit.h:2123

References CHAR_DEL_CHAR_AURA, CHAR_INS_AURA, CharacterDatabase, ObjectGuid::GetCounter(), Aura::GetDuration(), Aura::GetEffect(), Object::GetGUID(), IN_MILLISECONDS, Unit::m_ownedAuras, MAX_SPELL_EFFECTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB(), and SpawnCorpseBones().

◆ _SaveCharacter()

void Player::_SaveCharacter ( bool  create,
CharacterDatabaseTransaction  trans 
)
protected

Insert query TO DO: Filter out more redundant fields that can take their default value at player create

14800{
14801 CharacterDatabasePreparedStatement* stmt = nullptr;
14802 uint8 index = 0;
14803
14804 auto finiteAlways = [](float f) { return std::isfinite(f) ? f : 0.0f; };
14805
14806 if (create)
14807 {
14810 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER);
14811 stmt->SetData(index++, GetGUID().GetCounter());
14812 stmt->SetData(index++, GetSession()->GetAccountId());
14813 stmt->SetData(index++, GetName());
14814 stmt->SetData(index++, getRace(true));
14815 stmt->SetData(index++, getClass());
14816 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14817 stmt->SetData(index++, GetLevel());
14818 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14819 stmt->SetData(index++, GetMoney());
14820 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14821 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14822 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14823 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14824 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14825 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14826 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14827 stmt->SetData(index++, (uint32)GetPlayerFlags());
14828 stmt->SetData(index++, (uint16)GetMapId());
14829 stmt->SetData(index++, (uint32)GetInstanceId());
14830 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14831 stmt->SetData(index++, finiteAlways(GetPositionX()));
14832 stmt->SetData(index++, finiteAlways(GetPositionY()));
14833 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14834 stmt->SetData(index++, finiteAlways(GetOrientation()));
14835 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14836 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14837 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14838 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14839
14840 int32 lowGuidOrSpawnId = 0;
14841 if (Transport* transport = GetTransport())
14842 {
14843 if (transport->IsMotionTransport())
14844 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14845 else if (transport->IsStaticTransport())
14846 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14847 }
14848 stmt->SetData(index++, lowGuidOrSpawnId);
14849
14850 std::ostringstream ss;
14851 ss << m_taxi;
14852 stmt->SetData(index++, ss.str());
14853 stmt->SetData(index++, m_cinematic);
14854 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14855 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14856 stmt->SetData(index++, finiteAlways(_restBonus));
14857 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14858 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14859 //save, far from tavern/city
14860 //save, but in tavern/city
14861 stmt->SetData(index++, m_resetTalentsCost);
14862 stmt->SetData(index++, uint32(m_resetTalentsTime));
14863 stmt->SetData(index++, (uint16)m_ExtraFlags);
14864 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
14865 stmt->SetData(index++, (uint16)m_atLoginFlags);
14866 stmt->SetData(index++, GetZoneId());
14867 stmt->SetData(index++, uint32(m_deathExpireTime));
14868
14869 ss.str("");
14871
14872 stmt->SetData(index++, ss.str());
14873 stmt->SetData(index++, GetArenaPoints());
14874 stmt->SetData(index++, GetHonorPoints());
14878 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
14879 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
14883 stmt->SetData(index++, GetDrunkValue());
14884 stmt->SetData(index++, GetHealth());
14885
14886 for (uint32 i = 0; i < MAX_POWERS; ++i)
14887 stmt->SetData(index++, GetPower(Powers(i)));
14888
14889 stmt->SetData(index++, GetSession()->GetLatency());
14890
14891 stmt->SetData(index++, m_specsCount);
14892 stmt->SetData(index++, m_activeSpec);
14893
14894 ss.str("");
14895 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
14896 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
14897 stmt->SetData(index++, ss.str());
14898
14899 ss.str("");
14900 // cache equipment...
14901 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
14903
14904 // ...and bags for enum opcode
14906 {
14907 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
14908 ss << item->GetEntry();
14909 else
14910 ss << '0';
14911 ss << " 0 ";
14912 }
14913
14914 stmt->SetData(index++, ss.str());
14915 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
14916
14917 ss.str("");
14918 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
14920
14921 stmt->SetData(index++, ss.str());
14922 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
14923 stmt->SetData(index++, m_grantableLevels);
14924 stmt->SetData(index++, _innTriggerId);
14925 stmt->SetData(index++, m_extraBonusTalentCount);
14926 }
14927 else
14928 {
14929 // Update query
14930 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHARACTER);
14931 stmt->SetData(index++, GetName());
14932 stmt->SetData(index++, getRace(true));
14933 stmt->SetData(index++, getClass());
14934 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_3, 0)); // save gender from PLAYER_BYTES_3, UNIT_BYTES_0 changes with every transform effect
14935 stmt->SetData(index++, GetLevel());
14936 stmt->SetData(index++, GetUInt32Value(PLAYER_XP));
14937 stmt->SetData(index++, GetMoney());
14938 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 0));
14939 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 1));
14940 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 2));
14941 stmt->SetData(index++, GetByteValue(PLAYER_BYTES, 3));
14942 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 0));
14943 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 2));
14944 stmt->SetData(index++, GetByteValue(PLAYER_BYTES_2, 3));
14945 stmt->SetData(index++, GetPlayerFlags());
14946
14947 if (!IsBeingTeleported())
14948 {
14950 if (Map* m = FindMap())
14951 if (m->IsDungeon())
14952 {
14953 if (m->IsNonRaidDungeon()) dd = m->GetDifficulty();
14954 else rd = m->GetDifficulty();
14955 }
14956 stmt->SetData(index++, (uint16)GetMapId());
14957 stmt->SetData(index++, (uint32)GetInstanceId());
14958 stmt->SetData(index++, (uint8(dd) | uint8(rd) << 4));
14959 stmt->SetData(index++, finiteAlways(GetPositionX()));
14960 stmt->SetData(index++, finiteAlways(GetPositionY()));
14961 stmt->SetData(index++, finiteAlways(GetPositionZ()));
14962 stmt->SetData(index++, finiteAlways(GetOrientation()));
14963 }
14964 else
14965 {
14966 stmt->SetData(index++, (uint16)GetTeleportDest().GetMapId());
14967 stmt->SetData(index++, (uint32)0);
14968 stmt->SetData(index++, (uint8(GetDungeonDifficulty()) | uint8(GetRaidDifficulty()) << 4));
14969 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionX()));
14970 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionY()));
14971 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetPositionZ()));
14972 stmt->SetData(index++, finiteAlways(GetTeleportDest().GetOrientation()));
14973 }
14974
14975 stmt->SetData(index++, finiteAlways(GetTransOffsetX()));
14976 stmt->SetData(index++, finiteAlways(GetTransOffsetY()));
14977 stmt->SetData(index++, finiteAlways(GetTransOffsetZ()));
14978 stmt->SetData(index++, finiteAlways(GetTransOffsetO()));
14979
14980 int32 lowGuidOrSpawnId = 0;
14981 if (Transport* transport = GetTransport())
14982 {
14983 if (transport->IsMotionTransport())
14984 lowGuidOrSpawnId = static_cast<int32>(transport->GetGUID().GetCounter());
14985 else if (transport->IsStaticTransport())
14986 lowGuidOrSpawnId = -static_cast<int32>(transport->GetSpawnId());
14987 }
14988 stmt->SetData(index++, lowGuidOrSpawnId);
14989
14990 std::ostringstream ss;
14991 ss << m_taxi;
14992 stmt->SetData(index++, ss.str());
14993 stmt->SetData(index++, m_cinematic);
14994 stmt->SetData(index++, m_Played_time[PLAYED_TIME_TOTAL]);
14995 stmt->SetData(index++, m_Played_time[PLAYED_TIME_LEVEL]);
14996 stmt->SetData(index++, finiteAlways(_restBonus));
14997 stmt->SetData(index++, uint32(GameTime::GetGameTime().count()));
14998 stmt->SetData(index++, (HasPlayerFlag(PLAYER_FLAGS_RESTING) ? 1 : 0));
14999 //save, far from tavern/city
15000 //save, but in tavern/city
15001 stmt->SetData(index++, m_resetTalentsCost);
15002 stmt->SetData(index++, uint32(m_resetTalentsTime));
15003 stmt->SetData(index++, (uint16)m_ExtraFlags);
15004 stmt->SetData(index++, m_petStable ? m_petStable->MaxStabledPets : 0);
15005 stmt->SetData(index++, (uint16)m_atLoginFlags);
15006 stmt->SetData(index++, GetZoneId());
15007 stmt->SetData(index++, uint32(m_deathExpireTime));
15008
15009 ss.str("");
15011
15012 stmt->SetData(index++, ss.str());
15013 stmt->SetData(index++, GetArenaPoints());
15014 stmt->SetData(index++, GetHonorPoints());
15018 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 0));
15019 stmt->SetData(index++, GetUInt16Value(PLAYER_FIELD_KILLS, 1));
15023 stmt->SetData(index++, GetDrunkValue());
15024 stmt->SetData(index++, GetHealth());
15025
15026 for (uint32 i = 0; i < MAX_POWERS; ++i)
15027 stmt->SetData(index++, GetPower(Powers(i)));
15028
15029 stmt->SetData(index++, GetSession()->GetLatency());
15030
15031 stmt->SetData(index++, m_specsCount);
15032 stmt->SetData(index++, m_activeSpec);
15033
15034 ss.str("");
15035 for (uint32 i = 0; i < PLAYER_EXPLORED_ZONES_SIZE; ++i)
15036 ss << GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + i) << ' ';
15037 stmt->SetData(index++, ss.str());
15038
15039 ss.str("");
15040 // cache equipment...
15041 for (uint32 i = 0; i < EQUIPMENT_SLOT_END * 2; ++i)
15043
15044 // ...and bags for enum opcode
15046 {
15047 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
15048 ss << item->GetEntry();
15049 else
15050 ss << '0';
15051 ss << " 0 ";
15052 }
15053
15054 stmt->SetData(index++, ss.str());
15055 stmt->SetData(index++, GetUInt32Value(PLAYER_AMMO_ID));
15056
15057 ss.str("");
15058 for (uint32 i = 0; i < KNOWN_TITLES_SIZE * 2; ++i)
15060
15061 stmt->SetData(index++, ss.str());
15062 stmt->SetData(index++, GetByteValue(PLAYER_FIELD_BYTES, 2));
15063 stmt->SetData(index++, m_grantableLevels);
15064 stmt->SetData(index++, _innTriggerId);
15065 stmt->SetData(index++, m_extraBonusTalentCount);
15066
15067 stmt->SetData(index++, IsInWorld() && !GetSession()->PlayerLogout() ? 1 : 0);
15068 // Index
15069 stmt->SetData(index++, GetGUID().GetCounter());
15070 }
15071
15072 trans->Append(stmt);
15073}
@ CHAR_INS_CHARACTER
Definition CharacterDatabase.h:273
@ CHAR_UPD_CHARACTER
Definition CharacterDatabase.h:274
Difficulty
Definition DBCEnums.h:266
#define KNOWN_TITLES_SIZE
Definition Player.h:547
@ PLAYER_FLAGS_RESTING
Definition Player.h:473
@ INVENTORY_SLOT_BAG_START
Definition Player.h:694
#define PLAYER_EXPLORED_ZONES_SIZE
Definition Player.h:73
Powers
Definition SharedDefines.h:279
@ PLAYER_FIELD_TODAY_CONTRIBUTION
Definition UpdateFields.h:375
@ PLAYER_BYTES_3
Definition UpdateFields.h:183
@ PLAYER_XP
Definition UpdateFields.h:339
@ PLAYER_CHOSEN_TITLE
Definition UpdateFields.h:324
@ PLAYER_EXPLORED_ZONES_1
Definition UpdateFields.h:357
@ PLAYER_FIELD_KNOWN_CURRENCIES
Definition UpdateFields.h:338
@ PLAYER_BYTES_2
Definition UpdateFields.h:182
@ PLAYER__FIELD_KNOWN_TITLES
Definition UpdateFields.h:335
@ PLAYER_BYTES
Definition UpdateFields.h:181
@ PLAYER_FIELD_KILLS
Definition UpdateFields.h:374
@ PLAYER_FIELD_YESTERDAY_CONTRIBUTION
Definition UpdateFields.h:376
@ PLAYER_FIELD_WATCHED_FACTION_INDEX
Definition UpdateFields.h:379
@ PLAYER_VISIBLE_ITEM_1_ENTRYID
Definition UpdateFields.h:286
@ PLAYER_FIELD_LIFETIME_HONORABLE_KILLS
Definition UpdateFields.h:377
@ PLAYER_FIELD_BYTES
Definition UpdateFields.h:368
Definition Map.h:163
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:312
uint16 GetUInt16Value(uint16 index, uint8 offset) const
Definition Object.cpp:319
uint64 GetUInt64Value(uint16 index) const
Definition Object.cpp:300
std::string SaveTaxiDestinationsToString()
Definition PlayerTaxi.cpp:193
Difficulty GetRaidDifficulty() const
Definition Player.h:1917
WorldLocation & GetTeleportDest()
Definition Player.h:2089
uint32 GetArenaPoints() const
Definition Player.h:2153
uint8 GetDrunkValue() const
Definition Player.h:2171
Item * GetItemByPos(uint16 pos) const
Definition PlayerStorage.cpp:442
uint32 GetHonorPoints() const
Definition Player.h:2152
PlayerFlags GetPlayerFlags() const
Definition Player.h:1109
uint32 GetMoney() const
Definition Player.h:1603
PlayerTaxi m_taxi
Definition Player.h:1145
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1110
Difficulty GetDungeonDifficulty() const
Definition Player.h:1916
bool IsBeingTeleported() const
Definition Player.h:2090
Definition Transport.h:30
uint32 GetHealth() const
Definition Unit.h:1070
uint32 GetPower(Powers power) const
Definition Unit.h:1097
float GetTransOffsetX() const
Definition Object.h:684
uint32 GetInstanceId() const
Definition Object.h:510
float GetTransOffsetY() const
Definition Object.h:685
float GetTransOffsetZ() const
Definition Object.h:686
Transport * GetTransport() const
Definition Object.h:683
float GetTransOffsetO() const
Definition Object.h:687
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References _innTriggerId, _restBonus, CHAR_INS_CHARACTER, CHAR_UPD_CHARACTER, CharacterDatabase, EQUIPMENT_SLOT_END, WorldObject::FindMap(), GetArenaPoints(), Object::GetByteValue(), Unit::getClass(), ObjectGuid::GetCounter(), GetDrunkValue(), GetDungeonDifficulty(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetHealth(), GetHonorPoints(), WorldObject::GetInstanceId(), GetItemByPos(), WorldSession::GetLatency(), Unit::GetLevel(), WorldLocation::GetMapId(), GetMoney(), WorldObject::GetName(), Position::GetOrientation(), GetPlayerFlags(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetPower(), Unit::getRace(), GetRaidDifficulty(), GetSession(), GetTeleportDest(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), Object::GetUInt16Value(), Object::GetUInt32Value(), Object::GetUInt64Value(), WorldObject::GetZoneId(), HasPlayerFlag(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, IsBeingTeleported(), Object::IsInWorld(), KNOWN_TITLES_SIZE, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, m_extraBonusTalentCount, m_ExtraFlags, m_grantableLevels, m_petStable, m_Played_time, m_resetTalentsCost, m_resetTalentsTime, m_specsCount, m_taxi, MAX_POWERS, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_FIELD_BYTES, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_RESTING, PLAYER_VISIBLE_ITEM_1_ENTRYID, PLAYER_XP, WorldSession::PlayerLogout(), PlayerTaxi::SaveTaxiDestinationsToString(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveDailyQuestStatus()

void Player::_SaveDailyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7535{
7537 return;
7538
7539 m_DailyQuestChanged = false;
7540
7541 // save last daily quest time for all quests: we need only mostly reset time for reset check anyway
7542
7543 // we don't need transactions here.
7545 stmt->SetData(0, GetGUID().GetCounter());
7546 trans->Append(stmt);
7547 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
7548 {
7549 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
7550 {
7551 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7552 stmt->SetData(0, GetGUID().GetCounter());
7553 stmt->SetData(1, GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx));
7555 trans->Append(stmt);
7556 }
7557 }
7558
7559 if (!m_DFQuests.empty())
7560 {
7561 for (DFQuestsDoneList::iterator itr = m_DFQuests.begin(); itr != m_DFQuests.end(); ++itr)
7562 {
7563 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
7564 stmt->SetData(0, GetGUID().GetCounter());
7565 stmt->SetData(1, (*itr));
7567 trans->Append(stmt);
7568 }
7569 }
7570}
@ CHAR_DEL_QUEST_STATUS_DAILY_CHAR
Definition CharacterDatabase.h:59
@ CHAR_INS_CHARACTER_DAILYQUESTSTATUS
Definition CharacterDatabase.h:74

References CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_INS_CHARACTER_DAILYQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveEntryPoint()

void Player::_SaveEntryPoint ( CharacterDatabaseTransaction  trans)
protected
14717{
14718 // xinef: dont save joinpos with invalid mapid
14719 MapEntry const* mEntry = sMapStore.LookupEntry(m_entryPointData.joinPos.GetMapId());
14720 if (!mEntry)
14721 return;
14722
14724 stmt->SetData(0, GetGUID().GetCounter());
14725 trans->Append(stmt);
14726
14727 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PLAYER_ENTRY_POINT);
14728 stmt->SetData(0, GetGUID().GetCounter());
14734 stmt->SetData(6, m_entryPointData.taxiPath[0]);
14735 stmt->SetData(7, m_entryPointData.taxiPath[1]);
14737 trans->Append(stmt);
14738}
@ CHAR_INS_PLAYER_ENTRY_POINT
Definition CharacterDatabase.h:239
@ CHAR_DEL_PLAYER_ENTRY_POINT
Definition CharacterDatabase.h:240

References CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_INS_PLAYER_ENTRY_POINT, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), EntryPointData::joinPos, m_entryPointData, EntryPointData::mountSpell, PreparedStatementBase::SetData(), sMapStore, and EntryPointData::taxiPath.

Referenced by SaveToDB().

◆ _SaveEquipmentSets()

void Player::_SaveEquipmentSets ( CharacterDatabaseTransaction  trans)
protected
14666{
14667 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();)
14668 {
14669 uint32 index = itr->first;
14670 EquipmentSet& eqset = itr->second;
14671 CharacterDatabasePreparedStatement* stmt = nullptr;
14672 uint8 j = 0;
14673 switch (eqset.state)
14674 {
14676 ++itr;
14677 break; // nothing do
14679 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET);
14680 stmt->SetData(j++, eqset.Name.c_str());
14681 stmt->SetData(j++, eqset.IconName.c_str());
14682 stmt->SetData(j++, eqset.IgnoreMask);
14683 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14684 stmt->SetData(j++, eqset.Items[i].GetCounter());
14685 stmt->SetData(j++, GetGUID().GetCounter());
14686 stmt->SetData(j++, eqset.Guid);
14687 stmt->SetData(j, index);
14688 trans->Append(stmt);
14690 ++itr;
14691 break;
14692 case EQUIPMENT_SET_NEW:
14693 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET);
14694 stmt->SetData(j++, GetGUID().GetCounter());
14695 stmt->SetData(j++, eqset.Guid);
14696 stmt->SetData(j++, index);
14697 stmt->SetData(j++, eqset.Name.c_str());
14698 stmt->SetData(j++, eqset.IconName.c_str());
14699 stmt->SetData(j++, eqset.IgnoreMask);
14700 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14701 stmt->SetData(j++, eqset.Items[i].GetCounter());
14702 trans->Append(stmt);
14704 ++itr;
14705 break;
14707 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET);
14708 stmt->SetData(0, eqset.Guid);
14709 trans->Append(stmt);
14710 m_EquipmentSets.erase(itr++);
14711 break;
14712 }
14713 }
14714}
@ CHAR_UPD_EQUIP_SET
Definition CharacterDatabase.h:192
@ CHAR_INS_EQUIP_SET
Definition CharacterDatabase.h:193
@ CHAR_DEL_EQUIP_SET
Definition CharacterDatabase.h:194
@ EQUIPMENT_SET_CHANGED
Definition Player.h:738
@ EQUIPMENT_SET_DELETED
Definition Player.h:740
@ EQUIPMENT_SET_NEW
Definition Player.h:739

References CHAR_DEL_EQUIP_SET, CHAR_INS_EQUIP_SET, CHAR_UPD_EQUIP_SET, CharacterDatabase, EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, EQUIPMENT_SET_UNCHANGED, EQUIPMENT_SLOT_END, ObjectGuid::GetCounter(), Object::GetGUID(), EquipmentSet::Guid, EquipmentSet::IconName, EquipmentSet::IgnoreMask, EquipmentSet::Items, m_EquipmentSets, EquipmentSet::Name, PreparedStatementBase::SetData(), and EquipmentSet::state.

Referenced by SaveToDB().

◆ _SaveGlyphs()

void Player::_SaveGlyphs ( CharacterDatabaseTransaction  trans)
protected
15099{
15100 if (!NeedToSaveGlyphs())
15101 return;
15102
15104 stmt->SetData(0, GetGUID().GetCounter());
15105 trans->Append(stmt);
15106
15107 for (uint8 spec = 0; spec < m_specsCount; ++spec)
15108 {
15109 uint8 index = 0;
15110
15111 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_GLYPHS);
15112 stmt->SetData(index++, GetGUID().GetCounter());
15113 stmt->SetData(index++, spec);
15114
15115 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
15116 stmt->SetData(index++, uint16(m_Glyphs[spec][i]));
15117
15118 trans->Append(stmt);
15119 }
15120
15121 SetNeedToSaveGlyphs(false);
15122}
@ CHAR_DEL_CHAR_GLYPHS
Definition CharacterDatabase.h:422
@ CHAR_INS_CHAR_GLYPHS
Definition CharacterDatabase.h:456
void SetNeedToSaveGlyphs(bool val)
Definition Player.h:2602
bool NeedToSaveGlyphs()
Definition Player.h:2601

References CHAR_DEL_CHAR_GLYPHS, CHAR_INS_CHAR_GLYPHS, CharacterDatabase, Object::GetGUID(), m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, NeedToSaveGlyphs(), PreparedStatementBase::SetData(), and SetNeedToSaveGlyphs().

Referenced by SaveToDB().

◆ _SaveInstanceTimeRestrictions()

void Player::_SaveInstanceTimeRestrictions ( CharacterDatabaseTransaction  trans)
protected
15989{
15990 if (_instanceResetTimes.empty())
15991 return;
15992
15994 stmt->SetData(0, GetSession()->GetAccountId());
15995 trans->Append(stmt);
15996
15997 for (InstanceTimeMap::const_iterator itr = _instanceResetTimes.begin(); itr != _instanceResetTimes.end(); ++itr)
15998 {
15999 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES);
16000 stmt->SetData(0, GetSession()->GetAccountId());
16001 stmt->SetData(1, itr->first);
16002 stmt->SetData(2, (int64)itr->second);
16003 trans->Append(stmt);
16004 }
16005}
@ CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES
Definition CharacterDatabase.h:133
@ CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES
Definition CharacterDatabase.h:134
std::int64_t int64
Definition Define.h:102
uint32 GetAccountId() const
Definition WorldSession.h:423

References _instanceResetTimes, CHAR_DEL_ACCOUNT_INSTANCE_LOCK_TIMES, CHAR_INS_ACCOUNT_INSTANCE_LOCK_TIMES, CharacterDatabase, WorldSession::GetAccountId(), GetSession(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveInventory()

void Player::_SaveInventory ( CharacterDatabaseTransaction  trans)
protected
7255{
7256 CharacterDatabasePreparedStatement* stmt = nullptr;
7257 // force items in buyback slots to new state
7258 // and remove those that aren't already
7259 for (uint8 i = BUYBACK_SLOT_START; i < BUYBACK_SLOT_END; ++i)
7260 {
7261 Item* item = m_items[i];
7262 if (!item)
7263 continue;
7264
7265 if (item->GetState() == ITEM_NEW)
7266 {
7267 // Xinef: item is removed, remove loot from storage if any
7269 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7270 continue;
7271 }
7272
7273 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7274 stmt->SetData(0, item->GetGUID().GetCounter());
7275 trans->Append(stmt);
7276
7277 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7278 stmt->SetData(0, item->GetGUID().GetCounter());
7279 trans->Append(stmt);
7281
7282 // Xinef: item is removed, remove loot from storage if any
7284 sLootItemStorage->RemoveStoredLoot(item->GetGUID());
7285 }
7286
7287 // Updated played time for refundable items. We don't do this in Player::Update because there's simply no need for it,
7288 // the client auto counts down in real time after having received the initial played time on the first
7289 // SMSG_ITEM_REFUND_INFO_RESPONSE packet.
7290 // Item::UpdatePlayedTime is only called when needed, which is in DB saves, and item refund info requests.
7291 RefundableItemsSet::iterator i_next;
7292 for (RefundableItemsSet::iterator itr = m_refundableItems.begin(); itr != m_refundableItems.end(); itr = i_next)
7293 {
7294 // use copy iterator because itr may be invalid after operations in this loop
7295 i_next = itr;
7296 ++i_next;
7297
7298 Item* iPtr = GetItemByGuid((*itr));
7299 if (iPtr)
7300 {
7301 iPtr->UpdatePlayedTime(this);
7302 continue;
7303 }
7304 else
7305 {
7306 LOG_ERROR("entities.player", "Can't find item {} but is in refundable storage for player {} ! Removing.", (*itr).ToString(), GetGUID().ToString());
7307 m_refundableItems.erase(itr);
7308 }
7309 }
7310
7311 // update enchantment durations
7312 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
7313 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
7314
7315 // if no changes
7316 if (m_itemUpdateQueue.empty())
7317 return;
7318
7320 for (std::size_t i = 0; i < m_itemUpdateQueue.size(); ++i)
7321 {
7322 Item* item = m_itemUpdateQueue[i];
7323 if (!item)
7324 continue;
7325
7326 Bag* container = item->GetContainer();
7327 ObjectGuid::LowType bag_guid = container ? container->GetGUID().GetCounter() : 0;
7328
7329 if (item->GetState() != ITEM_REMOVED)
7330 {
7331 Item* test = GetItemByPos(item->GetBagSlot(), item->GetSlot());
7332 if (!test)
7333 {
7334 ObjectGuid::LowType bagTestGUID = 0;
7335 if (Item* test2 = GetItemByPos(INVENTORY_SLOT_BAG_0, item->GetBagSlot()))
7336 bagTestGUID = test2->GetGUID().GetCounter();
7337 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item {} (state {}) are incorrect, the player doesn't have an item at that position!",
7338 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), (int32)item->GetState());
7339 // according to the test that was just performed nothing should be in this slot, delete
7340 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT);
7341 stmt->SetData(0, bagTestGUID);
7342 stmt->SetData(1, item->GetSlot());
7343 stmt->SetData(2, lowGuid);
7344 trans->Append(stmt);
7345
7346 RemoveTradeableItem(item); // pussywizard
7347 RemoveEnchantmentDurationsReferences(item); // pussywizard
7348 RemoveItemDurations(item); // pussywizard
7349
7350 // also THIS item should be somewhere else, cheat attempt
7351 item->FSetState(ITEM_REMOVED); // we are IN updateQueue right now, can't use SetState which modifies the queue
7353 // don't skip, let the switch delete it
7354 continue;
7355 }
7356 else if (test != item)
7357 {
7358 LOG_ERROR("entities.player", "Player(GUID: {} Name: {})::_SaveInventory - the bag({}) and slot({}) values for the item ({}) are incorrect, the item ({}) is there instead!",
7359 lowGuid, GetName(), item->GetBagSlot(), item->GetSlot(), item->GetGUID().ToString(), test->GetGUID().ToString());
7360 // save all changes to the item...
7361 if (item->GetState() != ITEM_NEW) // only for existing items, no dupes
7362 item->SaveToDB(trans);
7363 // ...but do not save position in invntory
7364 continue;
7365 }
7366 }
7367
7368 switch (item->GetState())
7369 {
7370 case ITEM_NEW:
7371 case ITEM_CHANGED:
7372 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_INVENTORY_ITEM);
7373 stmt->SetData(0, lowGuid);
7374 stmt->SetData(1, bag_guid);
7375 stmt->SetData (2, item->GetSlot());
7376 stmt->SetData(3, item->GetGUID().GetCounter());
7377 trans->Append(stmt);
7378 break;
7379 case ITEM_REMOVED:
7380 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
7381 stmt->SetData(0, item->GetGUID().GetCounter());
7382 trans->Append(stmt);
7383 case ITEM_UNCHANGED:
7384 break;
7385 }
7386
7387 item->SaveToDB(trans); // item have unchanged inventory record and can be save standalone
7388 }
7389 m_itemUpdateQueue.clear();
7390}
@ CHAR_DEL_ITEM_INSTANCE
Definition CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition CharacterDatabase.h:435
@ CHAR_REP_INVENTORY_ITEM
Definition CharacterDatabase.h:123
@ CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT
Definition CharacterDatabase.h:436
@ ITEM_FLAG_HAS_LOOT
Definition ItemTemplate.h:149
@ ITEM_CHANGED
Definition Item.h:210
@ ITEM_NEW
Definition Item.h:211
#define sLootItemStorage
Definition LootItemStorage.h:73
@ BUYBACK_SLOT_END
Definition Player.h:720
uint8 GetSlot() const
Definition Item.h:281
Bag * GetContainer()
Definition Item.h:282
ItemUpdateState GetState() const
Definition Item.h:324
void UpdatePlayedTime(Player *owner)
Definition Item.cpp:1218
uint8 GetBagSlot() const
Definition Item.cpp:784
std::vector< Item * > m_itemUpdateQueue
Definition Player.h:2803
void DeleteRefundReference(ObjectGuid itemGUID)
Definition Player.cpp:15630
void RemoveTradeableItem(Item *item)
Definition PlayerStorage.cpp:4138
EnchantDurationList m_enchantDuration
Definition Player.h:2848
void RemoveItemDurations(Item *item)
Definition Player.cpp:12492
void RemoveEnchantmentDurationsReferences(Item *item)
Definition PlayerStorage.cpp:4213
RefundableItemsSet m_refundableItems
Definition Player.h:2951
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:408
bool HasFlag(ItemFlags flag) const
Definition ItemTemplate.h:825

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, CHAR_DEL_CHAR_INVENTORY_BY_BAG_SLOT, CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_ITEM_INSTANCE, CHAR_REP_INVENTORY_ITEM, CharacterDatabase, DeleteRefundReference(), Item::FSetState(), Item::GetBagSlot(), Item::GetContainer(), ObjectGuid::GetCounter(), Object::GetGUID(), Object::GetGUID(), GetItemByGuid(), GetItemByPos(), WorldObject::GetName(), Item::GetSlot(), Item::GetState(), Item::GetTemplate(), ItemTemplate::HasFlag(), INVENTORY_SLOT_BAG_0, ITEM_CHANGED, ITEM_FLAG_HAS_LOOT, ITEM_NEW, ITEM_REMOVED, ITEM_UNCHANGED, LOG_ERROR, m_enchantDuration, m_items, m_itemUpdateQueue, m_refundableItems, RemoveEnchantmentDurationsReferences(), RemoveItemDurations(), RemoveTradeableItem(), Item::SaveToDB(), PreparedStatementBase::SetData(), sLootItemStorage, ObjectGuid::ToString(), Position::ToString(), and Item::UpdatePlayedTime().

Referenced by SaveInventoryAndGoldToDB(), and SaveToDB().

◆ _SaveMail()

void Player::_SaveMail ( CharacterDatabaseTransaction  trans)
protected
7393{
7394 if (!GetMailSize() || !m_mailsUpdated)
7395 {
7396 return;
7397 }
7398
7399 CharacterDatabasePreparedStatement* stmt = nullptr;
7400
7401 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
7402 {
7403 Mail* m = (*itr);
7404 if (m->state == MAIL_STATE_CHANGED)
7405 {
7406 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_MAIL);
7407 stmt->SetData(0, uint8(m->HasItems() ? 1 : 0));
7408 stmt->SetData(1, uint32(m->expire_time));
7409 stmt->SetData(2, uint32(m->deliver_time));
7410 stmt->SetData(3, m->money);
7411 stmt->SetData(4, m->COD);
7412 stmt->SetData(5, uint8(m->checked));
7413 stmt->SetData(6, m->messageID);
7414
7415 trans->Append(stmt);
7416
7417 if (!m->removedItems.empty())
7418 {
7419 for (std::vector<uint32>::iterator itr2 = m->removedItems.begin(); itr2 != m->removedItems.end(); ++itr2)
7420 {
7421 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM);
7422 stmt->SetData(0, *itr2);
7423 trans->Append(stmt);
7424 }
7425 m->removedItems.clear();
7426 }
7428 }
7429 else if (m->state == MAIL_STATE_DELETED)
7430 {
7431 if (m->HasItems())
7432 {
7433 for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
7434 {
7435 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
7436 stmt->SetData(0, itr2->item_guid);
7437 trans->Append(stmt);
7438 }
7439 }
7440 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
7441 stmt->SetData(0, m->messageID);
7442 trans->Append(stmt);
7443
7444 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
7445 stmt->SetData(0, m->messageID);
7446 trans->Append(stmt);
7447 }
7448 }
7449
7450 //deallocate deleted mails...
7451 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end();)
7452 {
7453 if ((*itr)->state == MAIL_STATE_DELETED)
7454 {
7455 Mail* m = *itr;
7456 m_mail.erase(itr);
7457 delete m;
7458 itr = m_mail.begin();
7459 }
7460 else
7461 ++itr;
7462 }
7463
7464 m_mailsUpdated = false;
7465}
@ CHAR_UPD_MAIL
Definition CharacterDatabase.h:437
@ CHAR_DEL_MAIL_BY_ID
Definition CharacterDatabase.h:110
@ CHAR_DEL_MAIL_ITEM_BY_ID
Definition CharacterDatabase.h:382
@ MAIL_STATE_DELETED
Definition Mail.h:70
@ MAIL_STATE_CHANGED
Definition Mail.h:69
uint32 GetMailSize()
Definition Player.h:1644
bool HasItems() const
Definition Mail.h:206
std::vector< uint32 > removedItems
Definition Mail.h:177
std::vector< MailItemInfo > items
Definition Mail.h:176

References CHAR_DEL_ITEM_INSTANCE, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_UPD_MAIL, CharacterDatabase, Mail::checked, Mail::COD, Mail::deliver_time, Mail::expire_time, GetMailSize(), Mail::HasItems(), Mail::items, m_mail, m_mailsUpdated, MAIL_STATE_CHANGED, MAIL_STATE_DELETED, MAIL_STATE_UNCHANGED, Mail::messageID, Mail::money, Mail::removedItems, PreparedStatementBase::SetData(), and Mail::state.

Referenced by WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and SaveToDB().

◆ _SaveMonthlyQuestStatus()

void Player::_SaveMonthlyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7630{
7631 if (!m_MonthlyQuestChanged || m_monthlyquests.empty())
7632 return;
7633
7634 // we don't need transactions here.
7636 stmt->SetData(0, GetGUID().GetCounter());
7637 trans->Append(stmt);
7638
7639 for (QuestSet::const_iterator iter = m_monthlyquests.begin(); iter != m_monthlyquests.end(); ++iter)
7640 {
7641 uint32 quest_id = *iter;
7642 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
7643 stmt->SetData(0, GetGUID().GetCounter());
7644 stmt->SetData(1, quest_id);
7645 trans->Append(stmt);
7646 }
7647
7648 m_MonthlyQuestChanged = false;
7649}
@ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS
Definition CharacterDatabase.h:76
@ CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR
Definition CharacterDatabase.h:61

References CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_MonthlyQuestChanged, m_monthlyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SavePlayerSettings()

void Player::_SavePlayerSettings ( CharacterDatabaseTransaction  trans)
protected
145{
146 if (!sWorld->getBoolConfig(CONFIG_PLAYER_SETTINGS_ENABLED))
147 return;
148
149 for (auto const& [source, settings] : m_charSettingsMap)
150 {
151 if (settings.empty())
152 continue;
153
155 trans->Append(stmt);
156 }
157}
CharacterDatabasePreparedStatement * PrepareReplaceStatement(ObjectGuid::LowType playerLowGuid, std::string const &source, PlayerSettingVector const &settings)
Definition PlayerSettings.cpp:101

References CONFIG_PLAYER_SETTINGS_ENABLED, Object::GetGUID(), m_charSettingsMap, PlayerSettingsStore::PrepareReplaceStatement(), and sWorld.

Referenced by SaveToDB().

◆ _SaveQuestStatus()

void Player::_SaveQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7468{
7469 bool isTransaction = static_cast<bool>(trans);
7470 if (!isTransaction)
7471 trans = CharacterDatabase.BeginTransaction();
7472
7473 QuestStatusSaveMap::iterator saveItr;
7474 QuestStatusMap::iterator statusItr;
7475 CharacterDatabasePreparedStatement* stmt = nullptr;
7476
7477 bool keepAbandoned = !(sWorld->GetCleaningFlags() & CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS);
7478
7479 for (saveItr = m_QuestStatusSave.begin(); saveItr != m_QuestStatusSave.end(); ++saveItr)
7480 {
7481 if (saveItr->second)
7482 {
7483 statusItr = m_QuestStatus.find(saveItr->first);
7484 if (statusItr != m_QuestStatus.end() && (keepAbandoned || statusItr->second.Status != QUEST_STATUS_NONE))
7485 {
7486 uint8 index = 0;
7487 stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CHAR_QUESTSTATUS);
7488
7489 stmt->SetData(index++, GetGUID().GetCounter());
7490 stmt->SetData(index++, statusItr->first);
7491 stmt->SetData(index++, uint8(statusItr->second.Status));
7492 stmt->SetData(index++, statusItr->second.Explored);
7493 stmt->SetData(index++, uint32(statusItr->second.Timer / IN_MILLISECONDS + GameTime::GetGameTime().count()));
7494
7495 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
7496 stmt->SetData(index++, statusItr->second.CreatureOrGOCount[i]);
7497
7498 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
7499 stmt->SetData(index++, statusItr->second.ItemCount[i]);
7500
7501 stmt->SetData(index, statusItr->second.PlayerCount);
7502 trans->Append(stmt);
7503 }
7504 }
7505 else
7506 {
7507 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
7508 stmt->SetData(0, GetGUID().GetCounter());
7509 stmt->SetData(1, saveItr->first);
7510 trans->Append(stmt);
7511 }
7512 }
7513
7514 m_QuestStatusSave.clear();
7515
7516 for (saveItr = m_RewardedQuestsSave.begin(); saveItr != m_RewardedQuestsSave.end(); ++saveItr)
7517 {
7518 if (saveItr->second)
7519 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
7520 else // xinef: what the is this? quest can be removed by spelleffect if (!keepAbandoned)
7522
7523 stmt->SetData(0, GetGUID().GetCounter());
7524 stmt->SetData(1, saveItr->first);
7525 trans->Append(stmt);
7526 }
7527
7528 m_RewardedQuestsSave.clear();
7529
7530 if (!isTransaction)
7531 CharacterDatabase.CommitTransaction(trans);
7532}
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST
Definition CharacterDatabase.h:441
@ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST
Definition CharacterDatabase.h:439
@ CHAR_REP_CHAR_QUESTSTATUS
Definition CharacterDatabase.h:438
@ CHAR_INS_CHAR_QUESTSTATUS_REWARDED
Definition CharacterDatabase.h:440
QuestStatusSaveMap m_QuestStatusSave
Definition Player.h:2809
QuestStatusSaveMap m_RewardedQuestsSave
Definition Player.h:2812
@ CLEANING_FLAG_QUESTSTATUS
Definition CharacterDatabaseCleaner.h:31

References CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_INS_CHAR_QUESTSTATUS_REWARDED, CHAR_REP_CHAR_QUESTSTATUS, CharacterDatabase, CharacterDatabaseCleaner::CLEANING_FLAG_QUESTSTATUS, ObjectGuid::GetCounter(), GameTime::GetGameTime(), Object::GetGUID(), IN_MILLISECONDS, m_QuestStatus, m_QuestStatusSave, m_RewardedQuestsSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_NONE, PreparedStatementBase::SetData(), and sWorld.

Referenced by SaveToDB().

◆ _SaveSeasonalQuestStatus()

void Player::_SaveSeasonalQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7596{
7598 {
7599 return;
7600 }
7601
7602 // we don't need transactions here.
7604 stmt->SetData(0, GetGUID().GetCounter());
7605 trans->Append(stmt);
7606
7607 m_SeasonalQuestChanged = false;
7608
7609 if (m_seasonalquests.empty())
7610 {
7611 return;
7612 }
7613
7614 for (SeasonalEventQuestMap::const_iterator iter = m_seasonalquests.begin(); iter != m_seasonalquests.end(); ++iter)
7615 {
7616 uint16 eventId = iter->first;
7617
7618 for (SeasonalQuestSet::const_iterator itr = iter->second.begin(); itr != iter->second.end(); ++itr)
7619 {
7620 uint32 questId = *itr;
7621
7622 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
7623 stmt->SetArguments(GetGUID().GetCounter(), questId, eventId);
7624 trans->Append(stmt);
7625 }
7626 }
7627}
@ CHAR_INS_CHARACTER_SEASONALQUESTSTATUS
Definition CharacterDatabase.h:77
@ CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR
Definition CharacterDatabase.h:62
void SetArguments(Args &&... args)
Definition PreparedStatement.h:118

References CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_INS_CHARACTER_SEASONALQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_SeasonalQuestChanged, m_seasonalquests, PreparedStatementBase::SetArguments(), and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSkills()

void Player::_SaveSkills ( CharacterDatabaseTransaction  trans)
7652{
7653 CharacterDatabasePreparedStatement* stmt = nullptr;
7654 // we don't need transactions here.
7655 for (SkillStatusMap::iterator itr = mSkillStatus.begin(); itr != mSkillStatus.end();)
7656 {
7657 if (itr->second.uState == SKILL_UNCHANGED)
7658 {
7659 ++itr;
7660 continue;
7661 }
7662
7663 if (itr->second.uState == SKILL_DELETED)
7664 {
7665 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILL_BY_SKILL);
7666 stmt->SetData(0, GetGUID().GetCounter());
7667 stmt->SetData(1, itr->first);
7668 trans->Append(stmt);
7669
7670 mSkillStatus.erase(itr++);
7671 continue;
7672 }
7673
7674 uint32 valueData = GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos));
7675 uint16 value = SKILL_VALUE(valueData);
7676 uint16 max = SKILL_MAX(valueData);
7677
7678 switch (itr->second.uState)
7679 {
7680 case SKILL_NEW:
7681 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SKILLS);
7682 stmt->SetData(0, GetGUID().GetCounter());
7683 stmt->SetData(1, uint16(itr->first));
7684 stmt->SetData(2, value);
7685 stmt->SetData(3, max);
7686 trans->Append(stmt);
7687
7688 break;
7689 case SKILL_CHANGED:
7690 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UDP_CHAR_SKILLS);
7691 stmt->SetData(0, value);
7692 stmt->SetData(1, max);
7693 stmt->SetData(2, GetGUID().GetCounter());
7694 stmt->SetData(3, uint16(itr->first));
7695 trans->Append(stmt);
7696
7697 break;
7698 default:
7699 break;
7700 }
7701 itr->second.uState = SKILL_UNCHANGED;
7702
7703 ++itr;
7704 }
7705}
@ CHAR_INS_CHAR_SKILLS
Definition CharacterDatabase.h:446
@ CHAR_UDP_CHAR_SKILLS
Definition CharacterDatabase.h:447
@ CHAR_DEL_CHAR_SKILL_BY_SKILL
Definition CharacterDatabase.h:445
#define SKILL_MAX(x)
Definition Player.h:84
#define SKILL_VALUE(x)
Definition Player.h:83
@ SKILL_CHANGED
Definition Player.h:635
@ SKILL_NEW
Definition Player.h:636

References CHAR_DEL_CHAR_SKILL_BY_SKILL, CHAR_INS_CHAR_SKILLS, CHAR_UDP_CHAR_SKILLS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, PreparedStatementBase::SetData(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_UNCHANGED, and SKILL_VALUE.

Referenced by SaveToDB().

◆ _SaveSpellCooldowns()

void Player::_SaveSpellCooldowns ( CharacterDatabaseTransaction  trans,
bool  logout 
)
3636{
3638 stmt->SetData(0, GetGUID().GetCounter());
3639 trans->Append(stmt);
3640
3641 time_t curTime = GameTime::GetGameTime().count();
3642 uint32 curMSTime = GameTime::GetGameTimeMS().count();
3643 uint32 infTime = curMSTime + infinityCooldownDelayCheck;
3644
3645 bool first_round = true;
3646 std::ostringstream ss;
3647
3648 // remove outdated and save active
3649 for (SpellCooldowns::iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end();)
3650 {
3651 // Xinef: dummy cooldown for procs
3652 if (itr->first == uint32(-1))
3653 {
3654 ++itr;
3655 continue;
3656 }
3657
3658 if (itr->second.end <= curMSTime + 1000)
3659 m_spellCooldowns.erase(itr++);
3660 else if (itr->second.end <= infTime && (logout || itr->second.end > (curMSTime + 5 * MINUTE * IN_MILLISECONDS))) // not save locked cooldowns, it will be reset or set at reload
3661 {
3662 if (first_round)
3663 {
3664 ss << "INSERT INTO character_spell_cooldown (guid, spell, category, item, time, needSend) VALUES ";
3665 first_round = false;
3666 }
3667 // next new/changed record prefix
3668 else
3669 ss << ',';
3670
3671 uint64 cooldown = uint64(((itr->second.end - curMSTime) / IN_MILLISECONDS) + curTime);
3672 ss << '(' << GetGUID().GetCounter() << ',' << itr->first << ',' << itr->second.category << "," << itr->second.itemid << ',' << cooldown << ',' << (itr->second.needSendToClient ? '1' : '0') << ')';
3673 ++itr;
3674 }
3675 else
3676 ++itr;
3677 }
3678 // if something changed execute
3679 if (!first_round)
3680 trans->Append(ss.str().c_str());
3681}
@ CHAR_DEL_CHAR_SPELL_COOLDOWN
Definition CharacterDatabase.h:406
static constexpr uint32 infinityCooldownDelayCheck
Definition Unit.h:49

References CHAR_DEL_CHAR_SPELL_COOLDOWN, CharacterDatabase, ObjectGuid::GetCounter(), GameTime::GetGameTime(), GameTime::GetGameTimeMS(), Object::GetGUID(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveSpells()

void Player::_SaveSpells ( CharacterDatabaseTransaction  trans)
protected
7708{
7709 CharacterDatabasePreparedStatement* stmt = nullptr;
7710
7711 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end();)
7712 {
7713 // xinef: skip temporary spells
7714 if (itr->second->State == PLAYERSPELL_TEMPORARY)
7715 {
7716 ++itr;
7717 continue;
7718 }
7719
7720 // xinef: Delete statement for removed / updated spell
7721 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
7722 {
7723 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_BY_SPELL);
7724 stmt->SetData(0, GetGUID().GetCounter());
7725 stmt->SetData(1, itr->first);
7726 trans->Append(stmt);
7727 }
7728
7729 // xinef: insert statement for new / updated spell
7730 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
7731 {
7732 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_SPELL);
7733 stmt->SetData(0, GetGUID().GetCounter());
7734 stmt->SetData(1, itr->first);
7735 stmt->SetData(2, itr->second->specMask);
7736 trans->Append(stmt);
7737 }
7738
7739 if (itr->second->State == PLAYERSPELL_REMOVED)
7740 {
7741 delete itr->second;
7742 m_spells.erase(itr++);
7743 }
7744 else
7745 {
7746 itr->second->State = PLAYERSPELL_UNCHANGED;
7747 ++itr;
7748 }
7749 }
7750}
@ CHAR_INS_CHAR_SPELL
Definition CharacterDatabase.h:448
@ CHAR_DEL_CHAR_SPELL_BY_SPELL
Definition CharacterDatabase.h:399

References CHAR_DEL_CHAR_SPELL_BY_SPELL, CHAR_INS_CHAR_SPELL, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_spells, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveStats()

void Player::_SaveStats ( CharacterDatabaseTransaction  trans)
protected
7755{
7756 // check if stat saving is enabled and if char level is high enough
7757 if (!sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE) || GetLevel() < sWorld->getIntConfig(CONFIG_MIN_LEVEL_STAT_SAVE))
7758 return;
7759
7760 CharacterDatabasePreparedStatement* stmt = nullptr;
7761
7762 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_STATS);
7763 stmt->SetData(0, GetGUID().GetCounter());
7764 trans->Append(stmt);
7765
7766 uint8 index = 0;
7767
7768 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_STATS);
7769 stmt->SetData(index++, GetGUID().GetCounter());
7770 stmt->SetData(index++, GetMaxHealth());
7771
7772 for (uint8 i = 0; i < MAX_POWERS; ++i)
7773 stmt->SetData(index++, GetMaxPower(Powers(i)));
7774
7775 for (uint8 i = 0; i < MAX_STATS; ++i)
7776 stmt->SetData(index++, GetStat(Stats(i)));
7777
7778 for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
7779 stmt->SetData(index++, GetResistance(SpellSchools(i)));
7780
7789 stmt->SetData(index++, GetBaseSpellPowerBonus());
7791
7792 trans->Append(stmt);
7793}
@ CHAR_DEL_CHAR_STATS
Definition CharacterDatabase.h:449
@ CHAR_INS_CHAR_STATS
Definition CharacterDatabase.h:450
#define MAX_STATS
Definition SharedDefines.h:276
SpellSchools
Definition SharedDefines.h:293
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:303
Stats
Definition SharedDefines.h:268
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354
@ PLAYER_FIELD_COMBAT_RATING_1
Definition UpdateFields.h:380
@ PLAYER_PARRY_PERCENTAGE
Definition UpdateFields.h:348
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ PLAYER_DODGE_PERCENTAGE
Definition UpdateFields.h:347
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
@ CONFIG_MIN_LEVEL_STAT_SAVE
Definition WorldConfig.h:307
float GetFloatValue(uint16 index) const
Definition Object.cpp:306
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1968
uint32 GetResistance(SpellSchoolMask mask) const
Definition Unit.cpp:20092
uint32 GetMaxHealth() const
Definition Unit.h:1071
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1098
float GetStat(Stats stat) const
Definition Unit.h:1036

References CHAR_DEL_CHAR_STATS, CHAR_INS_CHAR_STATS, CharacterDatabase, CONFIG_MIN_LEVEL_STAT_SAVE, CR_CRIT_TAKEN_SPELL, GetBaseSpellPowerBonus(), Object::GetFloatValue(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), Object::GetUInt32Value(), MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, PreparedStatementBase::SetData(), sWorld, UNIT_FIELD_ATTACK_POWER, and UNIT_FIELD_RANGED_ATTACK_POWER.

Referenced by SaveToDB().

◆ _SaveTalents()

void Player::_SaveTalents ( CharacterDatabaseTransaction  trans)
protected
15143{
15144 CharacterDatabasePreparedStatement* stmt = nullptr;
15145
15146 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end();)
15147 {
15148 // xinef: skip temporary spells
15149 if (itr->second->State == PLAYERSPELL_TEMPORARY)
15150 {
15151 ++itr;
15152 continue;
15153 }
15154
15155 // xinef: delete statement for removed / updated talent
15156 if (itr->second->State == PLAYERSPELL_REMOVED || itr->second->State == PLAYERSPELL_CHANGED)
15157 {
15158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL);
15159 stmt->SetData(0, GetGUID().GetCounter());
15160 stmt->SetData(1, itr->first);
15161 trans->Append(stmt);
15162 }
15163
15164 // xinef: insert statement for new / updated spell
15165 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_CHANGED)
15166 {
15167 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_TALENT);
15168 stmt->SetData(0, GetGUID().GetCounter());
15169 stmt->SetData(1, itr->first);
15170 stmt->SetData(2, itr->second->specMask);
15171 trans->Append(stmt);
15172 }
15173
15174 if (itr->second->State == PLAYERSPELL_REMOVED)
15175 {
15176 delete itr->second;
15177 m_talents.erase(itr++);
15178 }
15179 else
15180 {
15181 itr->second->State = PLAYERSPELL_UNCHANGED;
15182 ++itr;
15183 }
15184 }
15185}
@ CHAR_INS_CHAR_TALENT
Definition CharacterDatabase.h:458
@ CHAR_DEL_CHAR_TALENT_BY_SPELL
Definition CharacterDatabase.h:457

References CHAR_DEL_CHAR_TALENT_BY_SPELL, CHAR_INS_CHAR_TALENT, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_talents, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, PLAYERSPELL_UNCHANGED, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _SaveWeeklyQuestStatus()

void Player::_SaveWeeklyQuestStatus ( CharacterDatabaseTransaction  trans)
protected
7573{
7574 if (!m_WeeklyQuestChanged || m_weeklyquests.empty())
7575 return;
7576
7577 // we don't need transactions here.
7579 stmt->SetData(0, GetGUID().GetCounter());
7580 trans->Append(stmt);
7581
7582 for (QuestSet::const_iterator iter = m_weeklyquests.begin(); iter != m_weeklyquests.end(); ++iter)
7583 {
7584 uint32 quest_id = *iter;
7585
7586 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
7587 stmt->SetData(0, GetGUID().GetCounter());
7588 stmt->SetData(1, quest_id);
7589 trans->Append(stmt);
7590 }
7591
7592 m_WeeklyQuestChanged = false;
7593}
@ CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR
Definition CharacterDatabase.h:60
@ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS
Definition CharacterDatabase.h:75

References CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), m_WeeklyQuestChanged, m_weeklyquests, and PreparedStatementBase::SetData().

Referenced by SaveToDB().

◆ _StoreItem()

Item * Player::_StoreItem ( uint16  pos,
Item pItem,
uint32  count,
bool  clone,
bool  update 
)
private
2607{
2608 if (!pItem)
2609 return nullptr;
2610
2611 uint8 bag = pos >> 8;
2612 uint8 slot = pos & 255;
2613
2614 LOG_DEBUG("entities.player.items", "STORAGE: StoreItem bag = {}, slot = {}, item = {}, count = {}, {}", bag, slot, pItem->GetEntry(), count, pItem->GetGUID().ToString());
2615
2616 Item* pItem2 = GetItemByPos(bag, slot);
2617
2618 if (!pItem2)
2619 {
2620 if (clone)
2621 pItem = pItem->CloneItem(count, this);
2622 else
2623 pItem->SetCount(count);
2624
2625 if (!pItem)
2626 return nullptr;
2627
2628 if (pItem->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2629 pItem->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2630 (pItem->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2631 pItem->SetBinding(true);
2632
2633 Bag* pBag = (bag == INVENTORY_SLOT_BAG_0) ? nullptr : GetBagByPos(bag);
2634 if (!pBag)
2635 {
2636 m_items[slot] = pItem;
2637 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2640
2641 pItem->SetSlot(slot);
2642 pItem->SetContainer(nullptr);
2643
2644 // need update known currency
2646 AddKnownCurrency(pItem->GetEntry());
2647 }
2648 else
2649 pBag->StoreItem(slot, pItem, update);
2650
2651 if (IsInWorld() && update)
2652 {
2653 pItem->AddToWorld();
2654 pItem->SendUpdateToPlayer(this);
2655 }
2656
2657 pItem->SetState(ITEM_CHANGED, this);
2658 if (pBag)
2659 pBag->SetState(ITEM_CHANGED, this);
2660
2662 AddItemDurations(pItem);
2663 UpdateItemObtainSpells(pItem, bag, slot);
2664
2665 return pItem;
2666 }
2667 else
2668 {
2669 if (pItem2->GetTemplate()->Bonding == BIND_WHEN_PICKED_UP ||
2670 pItem2->GetTemplate()->Bonding == BIND_QUEST_ITEM ||
2671 (pItem2->GetTemplate()->Bonding == BIND_WHEN_EQUIPPED && IsBagPos(pos)))
2672 pItem2->SetBinding(true);
2673
2674 pItem2->SetCount(pItem2->GetCount() + count);
2675 if (IsInWorld() && update)
2676 pItem2->SendUpdateToPlayer(this);
2677
2678 if (!clone)
2679 {
2680 // delete item (it not in any slot currently)
2681 if (IsInWorld() && update)
2682 {
2683 pItem->RemoveFromWorld();
2684 pItem->DestroyForPlayer(this);
2685 }
2686
2688 RemoveItemDurations(pItem);
2689
2690 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2691 pItem->SetNotRefundable(this);
2692 pItem->ClearSoulboundTradeable(this);
2693 RemoveTradeableItem(pItem);
2694 pItem->SetState(ITEM_REMOVED, this);
2695 }
2696
2698
2699 pItem2->SetState(ITEM_CHANGED, this);
2700
2701 UpdateItemObtainSpells(pItem2, bag, slot);
2702
2703 return pItem2;
2704 }
2705}
@ BIND_WHEN_EQUIPPED
Definition ItemTemplate.h:97
@ BIND_QUEST_ITEM
Definition ItemTemplate.h:99
@ BIND_WHEN_PICKED_UP
Definition ItemTemplate.h:96
@ CURRENCYTOKEN_SLOT_END
Definition Player.h:732
@ CURRENCYTOKEN_SLOT_START
Definition Player.h:731
@ PLAYER_FIELD_INV_SLOT_HEAD
Definition UpdateFields.h:327
@ ITEM_FIELD_OWNER
Definition UpdateFields.h:35
@ ITEM_FIELD_CONTAINED
Definition UpdateFields.h:36
void StoreItem(uint8 slot, Item *pItem, bool update)
Definition Bag.cpp:154
void SetState(ItemUpdateState state, Player *forplayer=nullptr)
Definition Item.cpp:714
void SetBinding(bool val)
Definition Item.h:235
Item * CloneItem(uint32 count, Player const *player=nullptr) const
Definition Item.cpp:1118
void SetCount(uint32 value)
Definition Item.h:273
void SetNotRefundable(Player *owner, bool changestate=true, CharacterDatabaseTransaction *trans=nullptr)
Definition Item.cpp:1200
void SetSlot(uint8 slot)
Definition Item.h:284
uint32 GetCount() const
Definition Item.h:272
void SetOwnerGUID(ObjectGuid guid)
Definition Item.h:232
void SetContainer(Bag *container)
Definition Item.h:286
virtual void DestroyForPlayer(Player *target, bool onDeath=false) const
Definition Object.cpp:263
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:712
virtual void AddToWorld()
Definition Object.cpp:141
virtual void RemoveFromWorld()
Definition Object.cpp:155
void SendUpdateToPlayer(Player *player)
Definition Object.cpp:235
Bag * GetBagByPos(uint8 slot) const
Definition PlayerStorage.cpp:458
void UpdateItemObtainSpells(Item *item, uint8 bag, uint8 slot)
Definition Player.cpp:7053
void AddEnchantmentDurations(Item *item)
Definition PlayerStorage.cpp:4185
void RemoveEnchantmentDurations(Item *item)
Definition PlayerStorage.cpp:4198
void AddItemDurations(Item *item)
Definition Player.cpp:12504
void AddKnownCurrency(uint32 itemId)
Definition Player.cpp:14261
uint32 Bonding
Definition ItemTemplate.h:663

References AddEnchantmentDurations(), AddItemDurations(), AddKnownCurrency(), Object::AddToWorld(), BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, Item::ClearSoulboundTradeable(), Item::CloneItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, Object::DestroyForPlayer(), GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, IsBagPos(), Object::IsInWorld(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, ITEM_REMOVED, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Item::SetBinding(), Item::SetContainer(), Item::SetCount(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetSlot(), Item::SetState(), Bag::StoreItem(), ObjectGuid::ToString(), and UpdateItemObtainSpells().

Referenced by StoreItem().

◆ _StoreOrEquipNewItem()

bool Player::_StoreOrEquipNewItem ( uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot,
int32  price,
ItemTemplate const *  pProto,
Creature pVendor,
VendorItem const *  crItem,
bool  bStore 
)
inline
10665{
10666 ItemPosCountVec vDest;
10667 uint16 uiDest = 0;
10668 InventoryResult msg = bStore ?
10669 CanStoreNewItem(bag, slot, vDest, item, pProto->BuyCount * count) :
10670 CanEquipNewItem(slot, uiDest, item, false);
10671 if (msg != EQUIP_ERR_OK)
10672 {
10673 SendEquipError(msg, nullptr, nullptr, item);
10674 return false;
10675 }
10676
10677 ModifyMoney(-price);
10678
10679 if (crItem->ExtendedCost) // case for new honor system
10680 {
10681 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10682 if (iece->reqhonorpoints)
10683 ModifyHonorPoints(- int32(iece->reqhonorpoints * count));
10684
10685 if (iece->reqarenapoints)
10686 ModifyArenaPoints(- int32(iece->reqarenapoints * count));
10687
10688 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10689 {
10690 if (iece->reqitem[i])
10691 DestroyItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count), true);
10692 }
10693 }
10694
10695 sScriptMgr->OnPlayerBeforeStoreOrEquipNewItem(this, vendorslot, item, count, bag, slot, pProto, pVendor, crItem, bStore);
10696
10697 Item* it = bStore ? StoreNewItem(vDest, item, true) : EquipNewItem(uiDest, item, true);
10698 if (it)
10699 {
10700 uint32 new_count = pVendor->UpdateVendorItemCurrentCount(crItem, pProto->BuyCount * count);
10701
10702 WorldPacket data(SMSG_BUY_ITEM, (8 + 4 + 4 + 4));
10703 data << pVendor->GetGUID();
10704 data << uint32(vendorslot + 1); // numbered from 1 at client
10705 data << int32(crItem->maxcount > 0 ? new_count : 0xFFFFFFFF);
10706 data << uint32(count);
10707 SendDirectMessage(&data);
10708 SendNewItem(it, pProto->BuyCount * count, true, false, false);
10709
10710 if (!bStore)
10712
10713 if (pProto->HasFlag(ITEM_FLAG_ITEM_PURCHASE_RECORD) && crItem->ExtendedCost && pProto->GetMaxStackSize() == 1)
10714 {
10716 it->SetRefundRecipient(GetGUID().GetCounter());
10717 it->SetPaidMoney(price);
10718 it->SetPaidExtendedCost(crItem->ExtendedCost);
10719 it->SaveRefundDataToDB();
10721 }
10722 }
10723
10724 sScriptMgr->OnPlayerAfterStoreOrEquipNewItem(this, vendorslot, it, count, bag, slot, pProto, pVendor, crItem, bStore);
10725
10726 return true;
10727}
DBCStorage< ItemExtendedCostEntry > sItemExtendedCostStore(ItemExtendedCostEntryfmt)
#define MAX_ITEM_EXTENDED_COST_REQUIREMENTS
Definition DBCStructure.h:1183
@ ITEM_FLAG_ITEM_PURCHASE_RECORD
Definition ItemTemplate.h:159
InventoryResult
Definition Item.h:46
uint32 UpdateVendorItemCurrentCount(VendorItem const *vItem, uint32 used_count)
Definition Creature.cpp:3113
void SaveRefundDataToDB()
Definition Item.cpp:1172
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:834
InventoryResult CanEquipNewItem(uint8 slot, uint16 &dest, uint32 item, bool swap) const
Definition PlayerStorage.cpp:1792
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5711
bool ModifyMoney(int32 amount, bool sendError=true)
Definition Player.cpp:11525
Item * EquipNewItem(uint16 pos, uint32 item, bool update)
Definition PlayerStorage.cpp:2707
void SendNewItem(Item *item, uint32 count, bool received, bool created, bool broadcast=false, bool sendChatMessage=true)
Definition PlayerStorage.cpp:4756
void AutoUnequipOffhandIfNeed(bool force=false)
Definition Player.cpp:12513
void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check=false)
Definition PlayerStorage.cpp:3120
void ModifyHonorPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
Definition Player.cpp:6297
void ModifyArenaPoints(int32 value, CharacterDatabaseTransaction trans=CharacterDatabaseTransaction(nullptr))
If trans is specified, honor save query will be added to trans.
Definition Player.cpp:6313
Item * StoreNewItem(ItemPosCountVec const &pos, uint32 item, bool update, int32 randomPropertyId=0)
Definition PlayerStorage.cpp:2530
void SendEquipError(InventoryResult msg, Item *pItem, Item *pItem2=nullptr, uint32 itemid=0)
Definition PlayerStorage.cpp:4020
InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec &dest, uint32 item, uint32 count, uint32 *no_space_count=nullptr) const
Definition Player.h:1280
Definition WorldPacket.h:26
@ SMSG_BUY_ITEM
Definition Opcodes.h:450
Definition DBCStructure.h:1186
uint32 reqarenapoints
Definition DBCStructure.h:1189
uint32 reqitemcount[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition DBCStructure.h:1192
uint32 reqitem[MAX_ITEM_EXTENDED_COST_REQUIREMENTS]
Definition DBCStructure.h:1191
uint32 reqhonorpoints
Definition DBCStructure.h:1188

References AddRefundReference(), AutoUnequipOffhandIfNeed(), ItemTemplate::BuyCount, CanEquipNewItem(), CanStoreNewItem(), DestroyItemCount(), EQUIP_ERR_OK, EquipNewItem(), VendorItem::ExtendedCost, Object::GetGUID(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), ItemTemplate::HasFlag(), ITEM_FIELD_FLAG_REFUNDABLE, ITEM_FIELD_FLAGS, ITEM_FLAG_ITEM_PURCHASE_RECORD, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, VendorItem::maxcount, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, Item::SaveRefundDataToDB(), SendDirectMessage(), SendEquipError(), SendNewItem(), Object::SetFlag(), Item::SetPaidExtendedCost(), Item::SetPaidMoney(), Item::SetRefundRecipient(), sItemExtendedCostStore, SMSG_BUY_ITEM, sScriptMgr, StoreNewItem(), and Creature::UpdateVendorItemCurrentCount().

Referenced by BuyItemFromVendorSlot().

◆ AbandonQuest()

void Player::AbandonQuest ( uint32  quest_id)
931{
932 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
933 {
934 // It will Destroy quest items on quests abandons.
935 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
936 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
937 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
938 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
939
940 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
941 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
942 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
943 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
944 }
945}
#define QUEST_SOURCE_ITEM_IDS_COUNT
Definition QuestDef.h:37

References BIND_QUEST_ITEM, DestroyItemCount(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, and sObjectMgr.

Referenced by WorldSession::HandleQuestLogRemoveQuest().

◆ ActivateSpec()

void Player::ActivateSpec ( uint8  spec)
15188{
15189 // xinef: some basic checks
15190 if (GetActiveSpec() == spec)
15191 return;
15192
15193 if (spec > GetSpecsCount())
15194 return;
15195
15196 // xinef: interrupt currently casted spell just in case
15197 if (IsNonMeleeSpellCast(false))
15199
15200 // xinef: save current actions order
15201 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15202 _SaveActions(trans);
15203 CharacterDatabase.CommitTransaction(trans);
15204
15205 // xinef: remove pet, it will be resummoned later
15206 if (Pet* pet = GetPet())
15208
15209 // xinef: remove other summoned units and clear reactives
15213
15214 // xinef: let client clear his current Actions
15216 uint8 oldSpec = GetActiveSpec();
15217
15218 std::unordered_set<uint32> removedSpecAuras;
15219
15220 // xinef: reset talent auras
15221 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15222 {
15223 if (itr->second->State == PLAYERSPELL_REMOVED)
15224 continue;
15225
15226 // xinef: remove all active talent auras
15227 if (!(itr->second->specMask & GetActiveSpecMask()))
15228 continue;
15229
15230 _removeTalentAurasAndSpells(itr->first);
15231
15232 // pussywizard: was => isn't
15233 if (!itr->second->IsInSpec(spec) && !itr->second->inSpellBook)
15234 SendLearnPacket(itr->first, false);
15235
15236 removedSpecAuras.insert(itr->first);
15237 }
15238
15239 // xinef: remove glyph auras
15240 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15241 if (uint32 glyphId = m_Glyphs[GetActiveSpec()][slot])
15242 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15243 {
15244 RemoveAurasDueToSpell(glyphEntry->SpellId);
15245 removedSpecAuras.insert(glyphEntry->SpellId);
15246 }
15247
15248 // xinef: set active spec as new one
15249 SetActiveSpec(spec);
15250 uint32 spentTalents = 0;
15251
15252 // xinef: add talent auras
15253 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
15254 {
15255 if (itr->second->State == PLAYERSPELL_REMOVED)
15256 continue;
15257
15258 // xinef: talent not in new spec
15259 if (!(itr->second->specMask & GetActiveSpecMask()))
15260 continue;
15261
15262 // pussywizard: wasn't => is
15263 if (!itr->second->IsInSpec(oldSpec) && !itr->second->inSpellBook)
15264 SendLearnPacket(itr->first, true);
15265
15266 _addTalentAurasAndSpells(itr->first);
15267 TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first);
15268 spentTalents += talentPos->rank + 1;
15269
15270 removedSpecAuras.erase(itr->first);
15271 }
15272
15273 // pussywizard: remove spells that are in previous spec, but are not present in new one (or are in new spec, but not in the old one)
15274 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15275 {
15276 if (!itr->second->Active || itr->second->State == PLAYERSPELL_REMOVED)
15277 continue;
15278
15279 // pussywizard: was => isn't
15280 if (itr->second->IsInSpec(oldSpec) && !itr->second->IsInSpec(spec))
15281 {
15282 SendLearnPacket(itr->first, false);
15283 // We want to remove all auras of the unlearned spell
15284 _removeTalentAurasAndSpells(itr->first);
15285
15286 removedSpecAuras.insert(itr->first);
15287 }
15288 // pussywizard: wasn't => is
15289 else if (!itr->second->IsInSpec(oldSpec) && itr->second->IsInSpec(spec))
15290 {
15291 SendLearnPacket(itr->first, true);
15292
15293 removedSpecAuras.erase(itr->first);
15294 }
15295 }
15296
15297 // xinef: apply glyphs from second spec
15298 if (GetActiveSpec() != oldSpec)
15299 {
15300 for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
15301 {
15302 uint32 glyphId = m_Glyphs[GetActiveSpec()][slot];
15303 if (glyphId)
15304 {
15305 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyphId))
15306 {
15308 removedSpecAuras.erase(glyphEntry->SpellId);
15309 }
15310 }
15311
15312 SetGlyph(slot, glyphId, true);
15313 }
15314 }
15315
15316 // Remove auras triggered/activated by talents/glyphs
15317 // Mostly explicit casts in dummy aura scripts
15318 if (!removedSpecAuras.empty())
15319 {
15320 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
15321 {
15322 Aura* aura = iter->second;
15323 if (SpellInfo const* triggeredByAuraSpellInfo = aura->GetTriggeredByAuraSpellInfo())
15324 {
15325 if (removedSpecAuras.find(triggeredByAuraSpellInfo->Id) != removedSpecAuras.end())
15326 {
15327 RemoveOwnedAura(iter);
15328 continue;
15329 }
15330 }
15331 ++iter;
15332 }
15333 }
15334
15335 m_usedTalentCount = spentTalents;
15337
15338 // load them asynchronously
15339 {
15341 stmt->SetData(0, GetGUID().GetCounter());
15342 stmt->SetData(1, m_activeSpec);
15343
15344 WorldSession* mySess = GetSession();
15345 mySess->GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)
15346 .WithPreparedCallback([mySess](PreparedQueryResult result)
15347 {
15348 // safe callback, we can't pass this pointer directly
15349 // in case player logs out before db response (player would be deleted in that case)
15350 if (Player* thisPlayer = mySess->GetPlayer())
15351 thisPlayer->LoadActions(result);
15352 }));
15353 }
15354
15355 // xinef: reset power
15356 Powers pw = getPowerType();
15357 if (pw != POWER_MANA)
15358 SetPower(POWER_MANA, 0); // Mana must be 0 even if it isn't the active power type.
15359 SetPower(pw, 0);
15360
15361 // xinef: remove titan grip if player had it set and does not have appropriate talent
15362 if (!HasTalent(46917, GetActiveSpec()) && m_canTitanGrip)
15363 SetCanTitanGrip(false);
15364 // xinef: remove dual wield if player does not have dual wield spell (shamans)
15365 if (!HasSpell(674) && CanDualWield())
15366 SetCanDualWield(false);
15367
15369
15370 // Xinef: Patch 3.2.0: Switching spec removes paladins spell Righteous Fury (25780)
15372 RemoveAurasDueToSpell(25780);
15373
15374 // Xinef: Remove talented single target auras at other targets
15375 AuraList& scAuras = GetSingleCastAuras();
15376 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
15377 {
15378 Aura* aura = *iter;
15379 if (!HasActiveSpell(aura->GetId()) && !HasTalent(aura->GetId(), GetActiveSpec()) && !aura->GetCastItemGUID())
15380 {
15381 aura->Remove();
15382 iter = scAuras.begin();
15383 }
15384 else
15385 ++iter;
15386 }
15387
15388 sScriptMgr->OnPlayerAfterSpecSlotChanged(this, GetActiveSpec());
15389}
@ CHAR_SEL_CHARACTER_ACTIONS_SPEC
Definition CharacterDatabase.h:81
@ POWER_MANA
Definition SharedDefines.h:280
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:238
T & AddCallback(T &&query)
Definition AsyncCallbackProcessor.h:34
uint32 GetId() const
Definition SpellAuras.cpp:466
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
SpellInfo const * GetTriggeredByAuraSpellInfo() const
Definition SpellAuras.cpp:2761
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
Definition Pet.h:41
void InitTalentForLevel()
Definition Player.cpp:2560
void SetCanTitanGrip(bool value)
Definition Player.cpp:13190
void SetActiveSpec(uint8 spec)
Definition Player.h:1738
Pet * GetPet() const
Definition Player.cpp:8977
bool HasTalent(uint32 spell_id, uint8 spec) const
Definition Player.cpp:3897
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
Definition Player.cpp:9127
void _SaveActions(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7148
uint8 GetActiveSpecMask() const
Definition Player.h:1737
uint8 GetSpecsCount() const
Definition Player.h:1739
bool HasSpell(uint32 spell) const override
Definition Player.cpp:3891
void SendActionButtons(uint32 state) const
Definition Player.cpp:5570
void _addTalentAurasAndSpells(uint32 spellId)
Definition Player.cpp:3015
virtual void SetCanDualWield(bool value)
Definition Unit.h:957
std::list< Aura * > AuraList
Definition Unit.h:667
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4188
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15595
bool CanDualWield() const
Definition Unit.h:956
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4158
void ClearAllReactives()
Definition Unit.cpp:16953
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11282
Powers getPowerType() const
Definition Unit.h:1093
AuraList & GetSingleCastAuras()
Definition Unit.h:1392
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11166
Player session in the World.
Definition WorldSession.h:369
QueryCallbackProcessor & GetQueryProcessor()
Definition WorldSession.h:1134
uint8 rank
Definition DBCStructure.h:2238

References _addTalentAurasAndSpells(), _removeTalentAurasAndSpells(), _SaveActions(), AsyncCallbackProcessor< T >::AddCallback(), AutoUnequipOffhandIfNeed(), Unit::CanDualWield(), Unit::CastSpell(), CHAR_SEL_CHARACTER_ACTIONS_SPEC, CharacterDatabase, CLASS_CONTEXT_ABILITY, CLASS_PALADIN, Unit::ClearAllReactives(), GetActiveSpec(), GetActiveSpecMask(), Aura::GetCastItemGUID(), Object::GetGUID(), Aura::GetId(), GetPet(), Unit::getPowerType(), WorldSession::GetQueryProcessor(), GetSession(), Unit::GetSingleCastAuras(), GetSpecsCount(), GetTalentSpellPos(), Aura::GetTriggeredByAuraSpellInfo(), HasActiveSpell(), HasSpell(), HasTalent(), InitTalentForLevel(), Unit::InterruptNonMeleeSpells(), IsClass(), Unit::IsNonMeleeSpellCast(), m_activeSpec, m_canTitanGrip, m_Glyphs, Unit::m_ownedAuras, m_spells, m_talents, m_usedTalentCount, MAX_GLYPH_SLOT_INDEX, PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, POWER_MANA, TalentSpellPos::rank, Aura::Remove(), Unit::RemoveAllControlled(), Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), RemovePet(), SendActionButtons(), SendLearnPacket(), SetActiveSpec(), Unit::SetCanDualWield(), SetCanTitanGrip(), PreparedStatementBase::SetData(), SetGlyph(), Unit::SetPower(), sGlyphPropertiesStore, sScriptMgr, TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_CASTER_AURASTATE, TRIGGERED_IGNORE_SHAPESHIFT, and Unit::UnsummonAllTotems().

Referenced by UpdateSpecCount().

◆ ActivateTaxiPathTo() [1/2]

bool Player::ActivateTaxiPathTo ( std::vector< uint32 > const &  nodes,
Creature npc = nullptr,
uint32  spellid = 1 
)
10264{
10265 if (nodes.size() < 2)
10266 return false;
10267
10268 // not let cheating with start flight in time of logout process || while in combat || has type state: stunned || has type state: root
10270 {
10272 return false;
10273 }
10274
10276 return false;
10277
10278 // taximaster case
10279 if (npc)
10280 {
10281 // not let cheating with start flight mounted
10282 if (IsMounted())
10283 {
10285 return false;
10286 }
10287
10289 {
10291 return false;
10292 }
10293
10294 // not let cheating with start flight in time of logout process || if casting not finished || while in combat || if not use Spell's with EffectSendTaxi
10295 if (IsNonMeleeSpellCast(false))
10296 {
10298 return false;
10299 }
10300 }
10301 // cast case or scripted call case
10302 else
10303 {
10305
10308
10310 if (spell->m_spellInfo->Id != spellid)
10312
10314
10316 if (spell->m_spellInfo->Id != spellid)
10318 }
10319
10320 uint32 sourcenode = nodes[0];
10321
10322 // starting node too far away (cheat?)
10323 TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(sourcenode);
10324 if (!node)
10325 {
10327 return false;
10328 }
10329
10330 // Prepare to flight start now
10331
10332 // stop combat at start taxi flight if any
10333 CombatStop();
10334
10337 ExitVehicle();
10338
10339 // stop trade (client cancel trade at taxi map open but cheating tools can be used for reopen it)
10340 TradeCancel(true);
10341
10342 // clean not finished taxi path if any
10344
10345 // 0 element current node
10346 m_taxi.AddTaxiDestination(sourcenode);
10347
10348 // fill destinations path tail
10349 uint32 sourcepath = 0;
10350 uint32 totalcost = 0;
10351 uint32 firstcost = 0;
10352
10353 uint32 prevnode = sourcenode;
10354 uint32 lastnode = 0;
10355
10356 for (uint32 i = 1; i < nodes.size(); ++i)
10357 {
10358 uint32 path, cost;
10359
10360 lastnode = nodes[i];
10361 sObjectMgr->GetTaxiPath(prevnode, lastnode, path, cost);
10362
10363 if (!path)
10364 {
10366 return false;
10367 }
10368
10369 totalcost += cost;
10370 if (i == 1)
10371 firstcost = cost;
10372
10373 if (prevnode == sourcenode)
10374 sourcepath = path;
10375
10376 m_taxi.AddTaxiDestination(lastnode);
10377
10378 prevnode = lastnode;
10379 }
10380
10381 // get mount model (in case non taximaster (npc == nullptr) allow more wide lookup)
10382 //
10383 // Hack-Fix for Alliance not being able to use Acherus taxi. There is
10384 // only one mount ID for both sides. Probably not good to use 315 in case DBC nodes
10385 // change but I couldn't find a suitable alternative. OK to use class because only DK
10386 // can use this taxi.
10387 uint32 mount_display_id = sObjectMgr->GetTaxiMountDisplayId(sourcenode, GetTeamId(true), npc == nullptr || (sourcenode == 315 && IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TAXI)));
10388
10389 // in spell case allow 0 model
10390 if ((mount_display_id == 0 && spellid == 0) || sourcepath == 0)
10391 {
10394 return false;
10395 }
10396
10397 uint32 money = GetMoney();
10398
10399 if (npc)
10400 {
10401 float discount = GetReputationPriceDiscount(npc);
10402 totalcost = uint32(ceil(totalcost * discount));
10403 firstcost = uint32(ceil(firstcost * discount));
10405 }
10406 else
10407 {
10409 }
10410
10411 if (money < totalcost)
10412 {
10415 return false;
10416 }
10417
10418 //Checks and preparations done, DO FLIGHT
10420
10421 // prevent stealth flight
10422 //RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
10423
10424 // Xinef: dont use instant flight paths if spellid is present (custom calls use spellid = 1)
10425 if ((sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 1 || (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && m_isInstantFlightOn)) && !spellid)
10426 {
10427 TaxiNodesEntry const* lastPathNode = sTaxiNodesStore.LookupEntry(nodes[nodes.size() - 1]);
10429 ModifyMoney(-(int32)totalcost);
10431 TeleportTo(lastPathNode->map_id, lastPathNode->x, lastPathNode->y, lastPathNode->z, GetOrientation());
10432 return false;
10433 }
10434 else
10435 {
10436 m_flightSpellActivated = spellid;
10437 ModifyMoney(-(int32)firstcost);
10440 GetSession()->SendDoFlight(mount_display_id, sourcepath);
10441 }
10442 return true;
10443}
npc
Definition BattlegroundSA.h:47
@ ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN
Definition DBCEnums.h:215
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING
Definition DBCEnums.h:176
DBCStorage< TaxiNodesEntry > sTaxiNodesStore(TaxiNodesEntryfmt)
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ ERR_TAXIPLAYERBUSY
Definition SharedDefines.h:3868
@ ERR_TAXIOK
Definition SharedDefines.h:3861
@ ERR_TAXINOSUCHPATH
Definition SharedDefines.h:3863
@ ERR_TAXIUNSPECIFIEDSERVERERROR
Definition SharedDefines.h:3862
@ ERR_TAXIPLAYERSHAPESHIFTED
Definition SharedDefines.h:3870
@ ERR_TAXIPLAYERALREADYMOUNTED
Definition SharedDefines.h:3869
@ ERR_TAXINOTENOUGHMONEY
Definition SharedDefines.h:3864
@ SPELL_AURA_MOD_SHAPESHIFT
Definition SpellAuraDefines.h:99
@ CLASS_CONTEXT_TAXI
Definition UnitDefines.h:235
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:256
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:541
@ CURRENT_GENERIC_SPELL
Definition Unit.h:540
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:542
@ CONFIG_INSTANT_TAXI
Definition WorldConfig.h:340
void AddTaxiDestination(uint32 dest)
Definition PlayerTaxi.h:62
void SetFlightMasterFactionTemplateId(uint32 factionTemplateId)
Definition PlayerTaxi.h:78
void ClearTaxiDestinations()
Definition PlayerTaxi.h:61
TeamId GetTeamId(bool original=false) const
Definition Player.h:2108
float GetReputationPriceDiscount(Creature const *creature) const
Definition Player.cpp:12386
void TradeCancel(bool sendback, TradeStatus status=TRADE_STATUS_TRADE_CANCELED)
Definition PlayerStorage.cpp:4087
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1350
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9364
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13203
Definition Spell.h:295
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4116
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10512
bool IsInDisallowedMountForm() const
Definition Unit.cpp:21143
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:732
bool IsMounted() const
Definition Unit.h:1841
bool HasUnitState(const uint32 f) const
Definition Unit.h:721
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5178
bool IsInCombat() const
Definition Unit.h:917
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19497
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1535
void SendActivateTaxiReply(ActivateTaxiReply reply)
Definition TaxiHandler.cpp:295
void SendDoFlight(uint32 mountDisplayId, uint32 path, uint32 pathNode=0)
Definition TaxiHandler.cpp:109
Definition DBCStructure.h:1954
float z
Definition DBCStructure.h:1959
uint32 map_id
Definition DBCStructure.h:1956
float x
Definition DBCStructure.h:1957
float y
Definition DBCStructure.h:1958

References ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, PlayerTaxi::AddTaxiDestination(), CLASS_CONTEXT_TAXI, CLASS_DEATH_KNIGHT, PlayerTaxi::ClearTaxiDestinations(), Unit::CombatStop(), CONFIG_INSTANT_TAXI, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, ERR_TAXINOSUCHPATH, ERR_TAXINOTENOUGHMONEY, ERR_TAXIOK, ERR_TAXIPLAYERALREADYMOUNTED, ERR_TAXIPLAYERBUSY, ERR_TAXIPLAYERSHAPESHIFTED, ERR_TAXIUNSPECIFIEDSERVERERROR, Unit::ExitVehicle(), Unit::GetCurrentSpell(), GetMoney(), Position::GetOrientation(), GetReputationPriceDiscount(), GetSession(), GetTeamId(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::InterruptSpell(), IsClass(), Unit::IsInCombat(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), Unit::IsNonMeleeSpellCast(), m_flightSpellActivated, m_isInstantFlightOn, m_taxi, TaxiNodesEntry::map_id, ModifyMoney(), Unit::RemoveAurasByType(), WorldSession::SendActivateTaxiReply(), WorldSession::SendDoFlight(), PlayerTaxi::SetFlightMasterFactionTemplateId(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiNodesStore, StopCastingBindSight(), StopCastingCharm(), sWorld, TeleportTo(), TradeCancel(), UNIT_FLAG_DISABLE_MOVE, UNIT_STATE_ROOT, UNIT_STATE_STUNNED, UpdateAchievementCriteria(), TaxiNodesEntry::x, TaxiNodesEntry::y, and TaxiNodesEntry::z.

Referenced by ActivateTaxiPathTo(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), Aura::HandleAuraSpecificMods(), OPvPCapturePointNA::HandleCustomSpell(), npc_taxi::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), and npc_karynaku::OnQuestAccept().

◆ ActivateTaxiPathTo() [2/2]

bool Player::ActivateTaxiPathTo ( uint32  taxi_path_id,
uint32  spellid = 1 
)
10446{
10447 TaxiPathEntry const* entry = sTaxiPathStore.LookupEntry(taxi_path_id);
10448 if (!entry)
10449 return false;
10450
10451 std::vector<uint32> nodes;
10452
10453 nodes.resize(2);
10454 nodes[0] = entry->from;
10455 nodes[1] = entry->to;
10456
10457 return ActivateTaxiPathTo(nodes, nullptr, spellid);
10458}
DBCStorage< TaxiPathEntry > sTaxiPathStore(TaxiPathEntryfmt)
bool ActivateTaxiPathTo(std::vector< uint32 > const &nodes, Creature *npc=nullptr, uint32 spellid=1)
Definition Player.cpp:10263
Definition DBCStructure.h:1966
uint32 to
Definition DBCStructure.h:1969
uint32 from
Definition DBCStructure.h:1968

References ActivateTaxiPathTo(), TaxiPathEntry::from, sTaxiPathStore, and TaxiPathEntry::to.

◆ addActionButton()

ActionButton * Player::addActionButton ( uint8  button,
uint32  action,
uint8  type 
)
5642{
5643 if (!IsActionButtonDataValid(button, action, type))
5644 return nullptr;
5645
5646 // it create new button (NEW state) if need or return existed
5647 ActionButton& ab = m_actionButtons[button];
5648
5649 // set data and update to CHANGED if not NEW
5650 ab.SetActionAndType(action, ActionButtonType(type));
5651
5652 LOG_DEBUG("entities.player", "Player {} Added Action {} (type {}) to Button {}", GetGUID().ToString(), action, type, button);
5653 return &ab;
5654}
ActionButtonType
Definition Player.h:230
bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type)
Definition Player.cpp:5598
void SetActionAndType(uint32 action, ActionButtonType type)
Definition Player.h:258

References Object::GetGUID(), IsActionButtonDataValid(), LOG_DEBUG, m_actionButtons, ActionButton::SetActionAndType(), and Position::ToString().

Referenced by _LoadActions(), Create(), and WorldSession::HandleSetActionButtonOpcode().

◆ AddArmorProficiency()

void Player::AddArmorProficiency ( uint32  newflag)
inline
1358{ m_ArmorProficiency |= newflag; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ AddBattlegroundQueueId()

uint32 Player::AddBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12295{
12296 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12297 {
12298 if (_BgBattlegroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE || _BgBattlegroundQueueID[i].bgQueueTypeId == val)
12299 {
12300 _BgBattlegroundQueueID[i].bgQueueTypeId = val;
12301 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12302 return i;
12303 }
12304 }
12305
12307}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattlemasterJoinArena(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ AddBonusTalent()

void Player::AddBonusTalent ( uint32  count)
inline
1731{ m_extraBonusTalentCount += count; };

References m_extraBonusTalentCount.

◆ AddEnchantmentDuration()

void Player::AddEnchantmentDuration ( Item item,
EnchantmentSlot  slot,
uint32  duration 
)
4274{
4275 if (!item)
4276 return;
4277
4278 if (slot >= MAX_ENCHANTMENT_SLOT)
4279 return;
4280
4281 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4282 {
4283 if (itr->item == item && itr->slot == slot)
4284 {
4285 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4286 m_enchantDuration.erase(itr);
4287 break;
4288 }
4289 }
4290 if (item && duration > 0)
4291 {
4292 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), item->GetGUID(), slot, uint32(duration / 1000));
4293 m_enchantDuration.push_back(EnchantDuration(item, slot, duration));
4294 }
4295}
@ MAX_ENCHANTMENT_SLOT
Definition Item.h:183
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration)
Definition ItemHandler.cpp:1046
Definition Player.h:437

References Object::GetGUID(), Object::GetGUID(), GetSession(), m_enchantDuration, MAX_ENCHANTMENT_SLOT, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by AddEnchantmentDurations(), and ApplyEnchantment().

◆ AddEnchantmentDurations()

void Player::AddEnchantmentDurations ( Item item)
4186{
4187 for (int x = 0; x < MAX_ENCHANTMENT_SLOT; ++x)
4188 {
4189 if (!item->GetEnchantmentId(EnchantmentSlot(x)))
4190 continue;
4191
4192 uint32 duration = item->GetEnchantmentDuration(EnchantmentSlot(x));
4193 if (duration > 0)
4194 AddEnchantmentDuration(item, EnchantmentSlot(x), duration);
4195 }
4196}
EnchantmentSlot
Definition Item.h:168
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
uint32 GetEnchantmentDuration(EnchantmentSlot slot) const
Definition Item.h:305
void AddEnchantmentDuration(Item *item, EnchantmentSlot slot, uint32 duration)
Definition PlayerStorage.cpp:4273

References AddEnchantmentDuration(), Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), and MAX_ENCHANTMENT_SLOT.

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddInstanceEnterTime()

void Player::AddInstanceEnterTime ( uint32  instanceId,
time_t  enterTime 
)
inline
2455 {
2456 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
2457 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
2458 }

References _instanceResetTimes, and HOUR.

Referenced by InstanceMap::AddPlayerToMap().

◆ AddItem()

bool Player::AddItem ( uint32  itemId,
uint32  count 
)
15678{
15679 uint32 noSpaceForCount = 0;
15680 ItemPosCountVec dest;
15681 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, count, &noSpaceForCount);
15682 if (msg != EQUIP_ERR_OK)
15683 count -= noSpaceForCount;
15684
15685 if (count == 0 || dest.empty())
15686 {
15687 // -- TODO: Send to mailbox if no space
15688 ChatHandler(GetSession()).PSendSysMessage("You don't have any space in your bags.");
15689 return false;
15690 }
15691
15692 Item* item = StoreNewItem(dest, itemId, true);
15693 if (item)
15694 SendNewItem(item, count, true, false);
15695 else
15696 return false;
15697 return true;
15698}
@ NULL_BAG
Definition Item.h:40
Definition Chat.h:37
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:211

References CanStoreNewItem(), EQUIP_ERR_OK, GetSession(), NULL_BAG, NULL_SLOT, ChatHandler::PSendSysMessage(), SendNewItem(), and StoreNewItem().

Referenced by spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), spell_q9452_cast_net::HandleDummy(), spell_catch_the_wild_wolpertinger::HandleEffectApply(), RewardHonor(), and npc_tharnarian::npc_tharnarianAI::sGossipSelect().

◆ AddItemDurations()

void Player::AddItemDurations ( Item item)
12505{
12507 {
12508 m_itemDuration.push_back(item);
12509 item->SendTimeUpdate(this);
12510 }
12511}
@ ITEM_FIELD_DURATION
Definition UpdateFields.h:40
void SendTimeUpdate(Player *owner)
Definition Item.cpp:1075
ItemDurationList m_itemDuration
Definition Player.h:2849

References Object::GetUInt32Value(), ITEM_FIELD_DURATION, m_itemDuration, and Item::SendTimeUpdate().

Referenced by _StoreItem(), EquipItem(), and QuickEquipItem().

◆ AddItemToBuyBackSlot()

void Player::AddItemToBuyBackSlot ( Item pItem,
uint32  money 
)
3936{
3937 if (pItem)
3938 {
3940 // if current back slot non-empty search oldest or free
3941 if (m_items[slot])
3942 {
3944 uint32 oldest_slot = BUYBACK_SLOT_START;
3945
3946 for (uint32 i = BUYBACK_SLOT_START + 1; i < BUYBACK_SLOT_END; ++i)
3947 {
3948 // found empty
3949 if (!m_items[i])
3950 {
3951 slot = i;
3952 break;
3953 }
3954
3956
3957 if (oldest_time > i_time)
3958 {
3959 oldest_time = i_time;
3960 oldest_slot = i;
3961 }
3962 }
3963
3964 // find oldest
3965 slot = oldest_slot;
3966 }
3967
3968 RemoveItemFromBuyBackSlot(slot, true);
3969 LOG_DEBUG("entities.player.items", "STORAGE: AddItemToBuyBackSlot item = {}, slot = {}", pItem->GetEntry(), slot);
3970
3971 m_items[slot] = pItem;
3972 time_t base = GameTime::GetGameTime().count();
3973 uint32 etime = uint32(base - m_logintime + (30 * 3600));
3974 uint32 eslot = slot - BUYBACK_SLOT_START;
3975
3979
3980 // move to next (for non filled list is move most optimized choice)
3983 }
3984}
@ PLAYER_FIELD_BUYBACK_PRICE_1
Definition UpdateFields.h:372
@ PLAYER_FIELD_VENDORBUYBACK_SLOT_1
Definition UpdateFields.h:331
@ PLAYER_FIELD_BUYBACK_TIMESTAMP_1
Definition UpdateFields.h:373
void RemoveItemFromBuyBackSlot(uint32 slot, bool del)
Definition PlayerStorage.cpp:3994

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, Object::GetEntry(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetUInt32Value(), LOG_DEBUG, m_currentBuybackSlot, m_items, m_logintime, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, RemoveItemFromBuyBackSlot(), Object::SetGuidValue(), and Unit::SetUInt32Value().

Referenced by WorldSession::HandleSellItemOpcode().

◆ AdditionalSavingAddMask()

◆ AddKnownCurrency()

void Player::AddKnownCurrency ( uint32  itemId)
private
14262{
14263 if (CurrencyTypesEntry const* ctEntry = sCurrencyTypesStore.LookupEntry(itemId))
14264 SetFlag64(PLAYER_FIELD_KNOWN_CURRENCIES, (1LL << (ctEntry->BitIndex - 1)));
14265}
DBCStorage< CurrencyTypesEntry > sCurrencyTypesStore(CurrencyTypesfmt)
void SetFlag64(uint16 index, uint64 newFlag)
Definition Object.cpp:945
Definition DBCStructure.h:835

References PLAYER_FIELD_KNOWN_CURRENCIES, sCurrencyTypesStore, and Object::SetFlag64().

Referenced by _StoreItem(), SetArenaPoints(), and SetHonorPoints().

◆ AddMail()

void Player::AddMail ( Mail mail)
inline
1643{ m_mail.push_front(mail); }// for call from WorldSession::SendMailTo

References m_mail.

Referenced by MailDraft::SendMailTo().

◆ AddMItem()

void Player::AddMItem ( Item it)
inline
1669 {
1670 ASSERT(it);
1671 //ASSERT deleted, because items can be added before loading
1672 mMitems[it->GetGUID().GetCounter()] = it;
1673 }

References ASSERT, ObjectGuid::GetCounter(), Object::GetGUID(), and mMitems.

Referenced by _LoadMailedItem(), and MailDraft::SendMailTo().

◆ AddNewMailDeliverTime()

void Player::AddNewMailDeliverTime ( time_t  deliver_time)
2885{
2886 if (deliver_time <= GameTime::GetGameTime().count()) // ready now
2887 {
2888 ++unReadMails;
2889 SendNewMail();
2890 }
2891 else // not ready and no have ready mails
2892 {
2893 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > deliver_time)
2894 m_nextMailDelivereTime = deliver_time;
2895 }
2896}
void SendNewMail()
Definition Player.cpp:2876

References GameTime::GetGameTime(), m_nextMailDelivereTime, SendNewMail(), and unReadMails.

Referenced by MailDraft::SendMailTo().

◆ AddQuest()

void Player::AddQuest ( Quest const *  quest,
Object questGiver 
)
508{
509 uint16 log_slot = FindQuestSlot(0);
510
511 if (log_slot >= MAX_QUEST_LOG_SIZE) // Player does not have any free slot in the quest log
512 return;
513
514 uint32 quest_id = quest->GetQuestId();
515
516 // if not exist then created with set uState == NEW and rewarded=false
517 QuestStatusData& questStatusData = m_QuestStatus[quest_id];
518
519 // check for repeatable quests status reset
520 questStatusData.Status = QUEST_STATUS_INCOMPLETE;
521 questStatusData.Explored = false;
522
523 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
524 {
525 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
526 questStatusData.ItemCount[i] = 0;
527 }
528
530 {
531 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
532 questStatusData.CreatureOrGOCount[i] = 0;
533 }
534
535 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
536 questStatusData.PlayerCount = 0;
537
538 GiveQuestSourceItem(quest);
539 AdjustQuestReqItemCount(quest, questStatusData);
540
541 if (quest->GetRepObjectiveFaction())
542 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction()))
543 GetReputationMgr().SetVisible(factionEntry);
544
545 if (quest->GetRepObjectiveFaction2())
546 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->GetRepObjectiveFaction2()))
547 GetReputationMgr().SetVisible(factionEntry);
548
549 uint32 qtime = 0;
550 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
551 {
552 uint32 timeAllowed = quest->GetTimeAllowed();
553
554 // shared timed quest
555 if (questGiver && questGiver->IsPlayer())
556 timeAllowed = questGiver->ToPlayer()->getQuestStatusMap()[quest_id].Timer / IN_MILLISECONDS;
557
558 AddTimedQuest(quest_id);
559 questStatusData.Timer = timeAllowed * IN_MILLISECONDS;
560 qtime = static_cast<uint32>(GameTime::GetGameTime().count()) + timeAllowed;
561 }
562 else
563 questStatusData.Timer = 0;
564
565 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
566 {
567 pvpInfo.IsHostile = true;
569 }
570
571 SetQuestSlot(log_slot, quest_id, qtime);
572
573 m_QuestStatusSave[quest_id] = true;
574
576
577 SendQuestUpdate(quest_id);
578
579 // check if Quest Tracker is enabled
580 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
581 {
582 // prepare Quest Tracker datas
583 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_QUEST_TRACK);
584 stmt->SetData(0, quest_id);
585 stmt->SetData(1, GetGUID().GetCounter());
586 stmt->SetData(2, GitRevision::GetHash());
587 stmt->SetData(3, GitRevision::GetDate());
588
589 // add to Quest Tracker
590 CharacterDatabase.Execute(stmt);
591 }
592
593 // Xinef: area auras may change on quest accept!
596}
@ CHAR_INS_QUEST_TRACK
Definition CharacterDatabase.h:503
@ ACHIEVEMENT_TIMED_TYPE_QUEST
Definition DBCEnums.h:111
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ QUEST_FLAGS_FLAGS_PVP
Definition QuestDef.h:145
@ QUEST_SPECIAL_FLAGS_CAST
Definition QuestDef.h:165
@ QUEST_SPECIAL_FLAGS_DELIVER
Definition QuestDef.h:175
@ QUEST_SPECIAL_FLAGS_KILL
Definition QuestDef.h:177
@ QUEST_SPECIAL_FLAGS_SPEAKTO
Definition QuestDef.h:176
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition QuestDef.h:179
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition WorldConfig.h:106
bool IsPlayer() const
Definition Object.h:201
Player * ToPlayer()
Definition Object.h:202
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition Player.cpp:13973
QuestStatusMap & getQuestStatusMap()
Definition Player.h:1621
uint16 FindQuestSlot(uint32 quest_id) const
Definition PlayerQuest.cpp:1782
void UpdatePvPState()
Definition PlayerUpdates.cpp:1436
void UpdateAreaDependentAuras(uint32 area_id)
Definition PlayerUpdates.cpp:1853
void SendQuestUpdate(uint32 questId)
Definition PlayerQuest.cpp:1526
void AdjustQuestReqItemCount(Quest const *quest, QuestStatusData &questStatusData)
Definition PlayerQuest.cpp:1764
PvPInfo pvpInfo
Definition Player.h:1842
void UpdateZoneDependentAuras(uint32 zone_id)
Definition PlayerUpdates.cpp:1839
bool GiveQuestSourceItem(Quest const *quest)
Definition PlayerQuest.cpp:1335
ReputationMgr & GetReputationMgr()
Definition Player.h:2125
void SetVisible(FactionTemplateEntry const *factionTemplateEntry)
Definition ReputationMgr.cpp:461
uint32 GetAreaId() const
Definition Object.cpp:3071
AC_COMMON_API char const * GetDate()
Definition GitRevision.cpp:26
AC_COMMON_API char const * GetHash()
Definition GitRevision.cpp:21
Definition DBCStructure.h:907
bool IsHostile
Definition Player.h:356

References ACHIEVEMENT_TIMED_TYPE_QUEST, AddTimedQuest(), AdjustQuestReqItemCount(), CHAR_INS_QUEST_TRACK, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, FindQuestSlot(), WorldObject::GetAreaId(), GitRevision::GetDate(), GameTime::GetGameTime(), Object::GetGUID(), GitRevision::GetHash(), Quest::GetQuestId(), getQuestStatusMap(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), GetReputationMgr(), Quest::GetTimeAllowed(), WorldObject::GetZoneId(), GiveQuestSourceItem(), Quest::HasFlag(), Quest::HasSpecialFlag(), IN_MILLISECONDS, PvPInfo::IsHostile, Object::IsPlayer(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QuestStatusData::PlayerCount, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, SendQuestUpdate(), SetQuestSlot(), ReputationMgr::SetVisible(), sFactionStore, StartTimedAchievement(), QuestStatusData::Status, sWorld, QuestStatusData::Timer, Object::ToPlayer(), UpdateAreaDependentAuras(), UpdatePvPState(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion().

◆ AddQuestAndCheckCompletion()

void Player::AddQuestAndCheckCompletion ( Quest const *  quest,
Object questGiver 
)
422{
423 AddQuest(quest, questGiver);
424
425 if (CanCompleteQuest(quest->GetQuestId()))
426 CompleteQuest(quest->GetQuestId());
427
428 if (!questGiver)
429 return;
430
431 switch (questGiver->GetTypeId())
432 {
433 case TYPEID_UNIT:
434 sScriptMgr->OnQuestAccept(this, questGiver->ToCreature(), quest);
435 questGiver->ToCreature()->AI()->sQuestAccept(this, quest);
436 break;
437 case TYPEID_ITEM:
438 case TYPEID_CONTAINER:
439 {
440 Item* item = (Item*)questGiver;
441 sScriptMgr->OnQuestAccept(this, item, quest);
442
443 // destroy not required for quest finish quest starting item
444 bool destroyItem = true;
445 for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
446 {
447 if (quest->RequiredItemId[i] == item->GetEntry() && item->GetTemplate()->MaxCount > 0)
448 {
449 destroyItem = false;
450 break;
451 }
452 }
453
454 if (destroyItem)
455 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
456
457 break;
458 }
460 sScriptMgr->OnQuestAccept(this, questGiver->ToGameObject(), quest);
461 questGiver->ToGameObject()->AI()->QuestAccept(this, quest);
462 break;
463 default:
464 break;
465 }
466}
@ TYPEID_GAMEOBJECT
Definition ObjectGuid.h:37
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEID_ITEM
Definition ObjectGuid.h:33
@ TYPEID_CONTAINER
Definition ObjectGuid.h:34
CreatureAI * AI() const
Definition Creature.h:145
virtual bool QuestAccept(Player *, Quest const *)
Definition GameObjectAI.h:57
GameObjectAI * AI() const
Definition GameObject.h:305
TypeID GetTypeId() const
Definition Object.h:128
GameObject * ToGameObject()
Definition Object.h:214
Creature * ToCreature()
Definition Object.h:206
void AddQuest(Quest const *quest, Object *questGiver)
Definition PlayerQuest.cpp:507
void CompleteQuest(uint32 quest_id)
Definition PlayerQuest.cpp:598
void DestroyItem(uint8 bag, uint8 slot, bool update)
Definition PlayerStorage.cpp:3024
bool CanCompleteQuest(uint32 quest_id, const QuestStatusData *q_savedStatus=nullptr)
Definition PlayerQuest.cpp:289
virtual void sQuestAccept(Player *, Quest const *)
Definition UnitAI.h:415
int32 MaxCount
Definition ItemTemplate.h:644

References AddQuest(), Creature::AI(), GameObject::AI(), CanCompleteQuest(), CompleteQuest(), DestroyItem(), Item::GetBagSlot(), Object::GetEntry(), Quest::GetQuestId(), Item::GetSlot(), Item::GetTemplate(), Object::GetTypeId(), ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, GameObjectAI::QuestAccept(), Quest::RequiredItemId, UnitAI::sQuestAccept(), sScriptMgr, Object::ToCreature(), Object::ToGameObject(), TYPEID_CONTAINER, TYPEID_GAMEOBJECT, TYPEID_ITEM, and TYPEID_UNIT.

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ AddReceivedSpectatorResetFor()

void Player::AddReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2585{ m_receivedSpectatorResetFor.insert(guid); }
GuidSet m_receivedSpectatorResetFor
Definition Player.h:2589

References m_receivedSpectatorResetFor.

Referenced by ArenaSpectator::HandleResetCommand().

◆ AddRefundReference()

void Player::AddRefundReference ( ObjectGuid  itemGUID)
15626{
15627 m_refundableItems.insert(itemGUID);
15628}

References m_refundableItems.

Referenced by _LoadItem(), and _StoreOrEquipNewItem().

◆ AddRuneByAuraEffect()

void Player::AddRuneByAuraEffect ( uint8  index,
RuneType  newType,
AuraEffect const *  aura 
)
inline
2523{ SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
void ConvertRune(uint8 index, RuneType newType)
Definition Player.cpp:13464
void SetRuneConvertAura(uint8 index, AuraEffect const *aura)
Definition Player.h:2522

References ConvertRune(), and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune().

◆ AddRunePower()

void Player::AddRunePower ( uint8  index)
13487{
13489 data << uint32(1 << index); // mask (0x00-0x3F probably)
13490 SendDirectMessage(&data);
13491}
@ SMSG_ADD_RUNE_POWER
Definition Opcodes.h:1190

References SendDirectMessage(), and SMSG_ADD_RUNE_POWER.

◆ addSpell()

bool Player::addSpell ( uint32  spellId,
uint8  addSpecMask,
bool  updateActive,
bool  temporary = false,
bool  learnFromSkill = false 
)
3050{
3051 if (!_addSpell(spellId, addSpecMask, temporary, learnFromSkill))
3052 return false;
3053
3054 if (!updateActive)
3055 return true;
3056
3057 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId); // must exist, checked in _addSpell
3058
3059 // pussywizard: now update active state for all ranks of this spell! and send packet to swap on action bar
3060 // pussywizard: assumption - it's in all specs, can't be a talent
3061 if (!spellInfo->IsStackableWithRanks() && spellInfo->IsRanked())
3062 {
3063 SpellInfo const* nextSpellInfo = sSpellMgr->GetSpellInfo(sSpellMgr->GetFirstSpellInChain(spellInfo->Id));
3064 while (nextSpellInfo)
3065 {
3066 PlayerSpellMap::iterator itr = m_spells.find(nextSpellInfo->Id);
3067 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active)
3068 {
3069 if (nextSpellInfo->GetRank() < spellInfo->GetRank())
3070 {
3071 itr->second->Active = false;
3072 if (IsInWorld())
3073 {
3075 data << uint32(nextSpellInfo->Id);
3076 data << uint32(spellInfo->Id);
3077 SendDirectMessage(&data);
3078 }
3079 return false;
3080 }
3081 else if (nextSpellInfo->GetRank() > spellInfo->GetRank())
3082 {
3083 PlayerSpellMap::iterator itr2 = m_spells.find(spellInfo->Id);
3084 if (itr2 != m_spells.end())
3085 itr2->second->Active = false;
3086 return false;
3087 }
3088 }
3089 nextSpellInfo = nextSpellInfo->GetNextRankSpell();
3090 }
3091 }
3092
3093 return true;
3094}
uint8 GetRank() const
Definition SpellInfo.cpp:2506
bool IsRanked() const
Definition SpellInfo.cpp:2501
bool IsStackableWithRanks() const
Definition SpellInfo.cpp:1145
SpellInfo const * GetNextRankSpell() const
Definition SpellInfo.cpp:2525
@ SMSG_SUPERCEDED_SPELL
Definition Opcodes.h:330

References _addSpell(), SpellInfo::GetNextRankSpell(), SpellInfo::GetRank(), SpellInfo::Id, Object::IsInWorld(), SpellInfo::IsRanked(), SpellInfo::IsStackableWithRanks(), m_spells, PLAYERSPELL_REMOVED, SendDirectMessage(), SMSG_SUPERCEDED_SPELL, and sSpellMgr.

Referenced by _LoadSpells(), LearnCustomSpells(), learnSkillRewardedSpells(), and learnSpell().

◆ AddSpellAndCategoryCooldowns()

void Player::AddSpellAndCategoryCooldowns ( SpellInfo const *  spellInfo,
uint32  itemId,
Spell spell = nullptr,
bool  infinityCooldown = false 
)
10930{
10931 // init cooldown values
10932 uint32 cat = 0;
10933 int32 rec = -1;
10934 int32 catrec = -1;
10935
10936 // some special item spells without correct cooldown in SpellInfo
10937 // cooldown information stored in item prototype
10938 // This used in same way in WorldSession::HandleItemQuerySingleOpcode data sending to client.
10939
10940 if (itemId)
10941 {
10942 if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId))
10943 {
10944 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
10945 {
10946 if (uint32(proto->Spells[idx].SpellId) == spellInfo->Id)
10947 {
10948 cat = proto->Spells[idx].SpellCategory;
10949 rec = proto->Spells[idx].SpellCooldown;
10950 catrec = proto->Spells[idx].SpellCategoryCooldown;
10951 break;
10952 }
10953 }
10954 }
10955 }
10956
10957 // if no cooldown found above then base at DBC data
10958 if (rec < 0 && catrec < 0)
10959 {
10960 cat = spellInfo->GetCategory();
10961 rec = spellInfo->RecoveryTime;
10962 catrec = spellInfo->CategoryRecoveryTime;
10963 }
10964
10965 time_t catrecTime;
10966 time_t recTime;
10967
10968 bool needsCooldownPacket = false;
10969
10970 // overwrite time for selected category
10971 if (infinityCooldown)
10972 {
10973 // use +MONTH as infinity mark for spell cooldown (will checked as MONTH/2 at save ans skipped)
10974 // but not allow ignore until reset or re-login
10975 catrecTime = catrec > 0 ? infinityCooldownDelay : 0;
10976 recTime = rec > 0 ? infinityCooldownDelay : catrecTime;
10977 }
10978 else
10979 {
10980 // shoot spells used equipped item cooldown values already assigned in GetAttackTime(RANGED_ATTACK)
10981 // prevent 0 cooldowns set by another way
10982 if (rec <= 0 && catrec <= 0 && (cat == 76 || (spellInfo->IsAutoRepeatRangedSpell() && spellInfo->Id != 75)))
10984
10985 // Now we have cooldown data (if found any), time to apply mods
10986 if (rec > 0)
10987 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, rec, spell);
10988
10989 if (catrec > 0 && !spellInfo->HasAttribute(SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS))
10990 {
10991 ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
10992 }
10993
10995 {
10996 // Apply SPELL_AURA_MOD_COOLDOWN only to own spells
10997 if (HasSpell(spellInfo->Id))
10998 {
10999 needsCooldownPacket = true;
11000 rec += cooldownMod * IN_MILLISECONDS; // SPELL_AURA_MOD_COOLDOWN does not affect category cooldows, verified with shaman shocks
11001 }
11002 }
11003
11004 // replace negative cooldowns by 0
11005 if (rec < 0) rec = 0;
11006 if (catrec < 0) catrec = 0;
11007
11008 // no cooldown after applying spell mods
11009 if (rec == 0 && catrec == 0)
11010 return;
11011
11012 catrecTime = catrec ? catrec : 0;
11013 recTime = rec ? rec : catrecTime;
11014 }
11015
11016 // category spells
11017 if (cat && catrec > 0)
11018 {
11019 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11020 if (needsCooldownPacket)
11021 {
11022 WorldPacket data;
11023 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, recTime);
11024 SendDirectMessage(&data);
11025 }
11026
11027 PacketCooldowns forcedCategoryCooldowns;
11028
11029 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
11030 if (i_scstore != sSpellsByCategoryStore.end())
11031 {
11032 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
11033 {
11034 if (i_scset->second == spellInfo->Id) // skip main spell, already handled above
11035 {
11036 continue;
11037 }
11038
11039 // If spell category is applied by item, then other spells should be exists in item templates
11040 if ((itemId > 0) != i_scset->first)
11041 {
11042 continue;
11043 }
11044
11045 // Only within the same spellfamily
11046 SpellInfo const* categorySpellInfo = sSpellMgr->GetSpellInfo(i_scset->second);
11047 if (!categorySpellInfo || categorySpellInfo->SpellFamilyName != spellInfo->SpellFamilyName)
11048 {
11049 continue;
11050 }
11051
11052 _AddSpellCooldown(i_scset->second, cat, itemId, catrecTime, !spellInfo->IsCooldownStartedOnEvent() && catrec && rec && catrec != rec);
11053
11054 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS))
11055 {
11056 forcedCategoryCooldowns[i_scset->second] = catrecTime;
11057 }
11058 }
11059 }
11060
11061 if (!forcedCategoryCooldowns.empty())
11062 {
11063 WorldPacket data;
11064 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, forcedCategoryCooldowns);
11065 SendDirectMessage(&data);
11066 }
11067 }
11068 else
11069 {
11070 // self spell cooldown
11071 if (recTime > 0)
11072 {
11073 _AddSpellCooldown(spellInfo->Id, 0, itemId, recTime, true, true);
11074
11075 if (needsCooldownPacket)
11076 {
11077 WorldPacket data;
11078 BuildCooldownPacket(data, SPELL_COOLDOWN_FLAG_NONE, spellInfo->Id, rec);
11079 SendDirectMessage(&data);
11080 }
11081 }
11082 }
11083}
SpellCategoryStore sSpellsByCategoryStore
Definition DBCStores.cpp:152
#define MAX_ITEM_SPELLS
Definition Item.h:215
@ SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS
Definition SharedDefines.h:646
@ SPELL_AURA_MOD_COOLDOWN
Definition SpellAuraDefines.h:259
@ SPELLMOD_COOLDOWN
Definition SpellDefines.h:87
@ SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS
Definition SpellInfo.h:204
static constexpr uint32 infinityCooldownDelay
Definition Unit.h:48
@ SPELL_COOLDOWN_FLAG_NONE
Definition Unit.h:614
std::unordered_map< uint32, uint32 > PacketCooldowns
Definition Unit.h:619
void ApplySpellMod(uint32 spellId, SpellModOp op, T &basevalue, Spell *spell=nullptr, bool temporaryPet=false)
Definition Player.cpp:9813
uint32 SpellFamilyName
Definition SpellInfo.h:387
void BuildCooldownPacket(WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
Definition Unit.cpp:20861
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:897
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:6009

References _AddSpellCooldown(), ApplySpellMod(), Unit::BuildCooldownPacket(), SpellInfo::CategoryRecoveryTime, Unit::GetAttackTime(), SpellInfo::GetCategory(), Unit::GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasSpell(), SpellInfo::Id, IN_MILLISECONDS, infinityCooldownDelay, SpellInfo::IsAutoRepeatRangedSpell(), SpellInfo::IsCooldownStartedOnEvent(), MAX_ITEM_SPELLS, RANGED_ATTACK, SpellInfo::RecoveryTime, SendDirectMessage(), sObjectMgr, SPELL_ATTR0_CU_FORCE_SEND_CATEGORY_COOLDOWNS, SPELL_ATTR6_NO_CATEGORY_COOLDOWN_MODS, SPELL_AURA_MOD_COOLDOWN, SPELL_COOLDOWN_FLAG_NONE, SpellInfo::SpellFamilyName, SPELLMOD_COOLDOWN, sSpellMgr, and sSpellsByCategoryStore.

Referenced by Aura::_ApplyForTarget(), Unit::AddGameObject(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), SendCooldownEvent(), Spell::SendSpellCooldown(), and Unit::SetMinion().

◆ AddSpellCooldown()

void Player::AddSpellCooldown ( uint32  spell_id,
uint32  itemid,
uint32  end_time,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
overridevirtual

◆ AddSpellMod()

void Player::AddSpellMod ( SpellModifier mod,
bool  apply 
)
9911{
9912 LOG_DEBUG("spells.aura", "Player::AddSpellMod {}", mod->spellId);
9914
9915 int i = 0;
9916 flag96 _mask = 0;
9917 for (int eff = 0; eff < 96; ++eff)
9918 {
9919 if (eff != 0 && eff % 32 == 0)
9920 _mask[i++] = 0;
9921
9922 _mask[i] = uint32(1) << (eff - (32 * i));
9923 if (mod->mask & _mask)
9924 {
9925 int32 val = 0;
9926 for (SpellModList::iterator itr = m_spellMods[mod->op].begin(); itr != m_spellMods[mod->op].end(); ++itr)
9927 {
9928 if ((*itr)->type == mod->type && (*itr)->mask & _mask)
9929 val += (*itr)->value;
9930 }
9931 val += apply ? mod->value : -(mod->value);
9932 WorldPacket data(Opcode, (1 + 1 + 4));
9933 data << uint8(eff);
9934 data << uint8(mod->op);
9935 data << int32(val);
9936 SendDirectMessage(&data);
9937 }
9938 }
9939
9940 if (apply)
9941 {
9942 m_spellMods[mod->op].push_back(mod);
9943 m_spellMods[mod->op].sort(SpellModPredicate());
9944 }
9945 else
9946 {
9947 m_spellMods[mod->op].remove(mod);
9948 // mods bound to aura will be removed in AuraEffect::~AuraEffect
9949 if (!mod->ownerAura)
9950 delete mod;
9951 }
9952}
@ SPELLMOD_FLAT
Definition Player.h:94
SpellModList m_spellMods[MAX_SPELLMOD]
Definition Player.h:2844
Definition Util.h:451
@ SMSG_SET_FLAT_SPELL_MODIFIER
Definition Opcodes.h:644
@ SMSG_SET_PCT_SPELL_MODIFIER
Definition Opcodes.h:645
void apply(T *val)
Definition ByteConverter.h:40
Definition Player.cpp:9901
SpellModOp op
Definition Player.h:184
SpellModType type
Definition Player.h:185
int32 value
Definition Player.h:187
uint32 spellId
Definition Player.h:189
Aura *const ownerAura
Definition Player.h:190
flag96 mask
Definition Player.h:188

References LOG_DEBUG, m_spellMods, SpellModifier::mask, SpellModifier::op, SpellModifier::ownerAura, SendDirectMessage(), SMSG_SET_FLAT_SPELL_MODIFIER, SMSG_SET_PCT_SPELL_MODIFIER, SpellModifier::spellId, SPELLMOD_FLAT, SpellModifier::type, and SpellModifier::value.

Referenced by AuraEffect::ApplySpellMod().

◆ addTalent()

bool Player::addTalent ( uint32  spellId,
uint8  addSpecMask,
uint8  oldTalentRank 
)
2899{
2900 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
2901 if (!SpellMgr::CheckSpellValid(spellInfo, spellId, true))
2902 return false;
2903
2904 TalentSpellPos const* talentPos = GetTalentSpellPos(spellId);
2905 if (!talentPos)
2906 return false;
2907
2908 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentPos->talent_id);
2909 if (!talentInfo)
2910 return false;
2911
2912 // xinef: remove old talent rank if any
2913 if (oldTalentRank)
2914 {
2915 _removeTalent(talentInfo->RankID[oldTalentRank - 1], addSpecMask);
2916 _removeTalentAurasAndSpells(talentInfo->RankID[oldTalentRank - 1]);
2917 SendLearnPacket(talentInfo->RankID[oldTalentRank - 1], false);
2918 }
2919
2920 // xinef: add talent auras and spells
2921 if (GetActiveSpecMask() & addSpecMask)
2922 _addTalentAurasAndSpells(spellId);
2923
2924 // xinef: find the spell on our talent map
2925 PlayerTalentMap::iterator itr = m_talents.find(spellId);
2926
2927 // xinef: we do not have such a spell on our talent map
2928 if (itr == m_talents.end())
2929 {
2931 PlayerTalent* newTalent = new PlayerTalent();
2932 newTalent->State = state;
2933 newTalent->specMask = addSpecMask;
2934 newTalent->talentID = talentInfo->TalentID;
2935 newTalent->inSpellBook = talentInfo->addToSpellBook && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL);
2936 m_talents[spellId] = newTalent;
2937
2938 if (GetActiveSpecMask() & addSpecMask)
2939 m_usedTalentCount += (talentPos->rank + 1) - oldTalentRank;
2940
2941 return true;
2942 }
2943 // xinef: if current mask does not cover addMask, add it to iterator and save changes to DB
2944 else if (!(itr->second->specMask & addSpecMask))
2945 {
2946 itr->second->specMask |= addSpecMask;
2947 if (itr->second->State != PLAYERSPELL_NEW)
2948 itr->second->State = PLAYERSPELL_CHANGED;
2949
2950 if (GetActiveSpecMask() & addSpecMask)
2951 m_usedTalentCount += (talentPos->rank + 1) - oldTalentRank;
2952
2953 return true;
2954 }
2955
2956 return false;
2957}
DBCStorage< TalentEntry > sTalentStore(TalentEntryfmt)
PlayerSpellState
Definition Player.h:119
Definition Player.h:136
PlayerSpellState State
Definition Player.h:137
bool inSpellBook
Definition Player.h:140
uint32 talentID
Definition Player.h:139
uint8 specMask
Definition Player.h:138
Definition DBCStructure.h:1924
std::array< uint32, MAX_TALENT_RANK > RankID
Definition DBCStructure.h:1929
uint32 TalentID
Definition DBCStructure.h:1925
uint32 addToSpellBook
Definition DBCStructure.h:1935
uint16 talent_id
Definition DBCStructure.h:2237

References _addTalentAurasAndSpells(), _removeTalent(), _removeTalentAurasAndSpells(), TalentEntry::addToSpellBook, SpellMgr::CheckSpellValid(), GetActiveSpecMask(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), PlayerTalent::inSpellBook, isBeingLoaded(), m_talents, m_usedTalentCount, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_UNCHANGED, TalentSpellPos::rank, TalentEntry::RankID, SendLearnPacket(), PlayerTalent::specMask, SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sSpellMgr, sTalentStore, PlayerTalent::State, TalentSpellPos::talent_id, PlayerTalent::talentID, and TalentEntry::TalentID.

Referenced by _LoadTalents(), and LearnTalent().

◆ AddTimedQuest()

void Player::AddTimedQuest ( uint32  quest_id)
inline
1553{ m_timedquests.insert(quest_id); }
QuestSet m_timedquests
Definition Player.h:2707

References m_timedquests.

Referenced by _LoadQuestStatus(), and AddQuest().

◆ AddToWorld()

void Player::AddToWorld ( )
overridevirtual
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be added when logging in

Reimplemented from Object.

1699{
1704
1705 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1706 if (m_items[i])
1707 m_items[i]->AddToWorld();
1708}
@ PLAYER_SLOT_START
Definition Player.h:659
@ PLAYER_SLOT_END
Definition Player.h:661
void AddToWorld() override
Definition Unit.cpp:15703

References Object::AddToWorld(), Unit::AddToWorld(), m_items, PLAYER_SLOT_END, and PLAYER_SLOT_START.

Referenced by Map::AddPlayerToMap().

◆ AddTradeableItem()

void Player::AddTradeableItem ( Item item)
4132{
4133 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4134 m_itemSoulboundTradeable.push_back(item);
4135}
std::mutex m_soulboundTradableLock
Definition Player.h:2851
ItemDurationList m_itemSoulboundTradeable
Definition Player.h:2850

References m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by _LoadItem(), MoveItemToInventory(), and StoreNewItem().

◆ AddWeaponProficiency()

void Player::AddWeaponProficiency ( uint32  newflag)
inline
1357{ m_WeaponProficiency |= newflag; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ AddWhisperWhiteList()

void Player::AddWhisperWhiteList ( ObjectGuid  guid)
inline
2565{ WhisperList.push_back(guid); }
WhisperListContainer WhisperList
Definition Player.h:2661

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ AdjustQuestReqItemCount()

void Player::AdjustQuestReqItemCount ( Quest const *  quest,
QuestStatusData questStatusData 
)
private
1765{
1766 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1767 {
1768 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
1769 {
1770 uint32 reqitemcount = quest->RequiredItemCount[i];
1771 if (reqitemcount != 0)
1772 {
1773 uint32 curitemcount = GetItemCount(quest->RequiredItemId[i], true);
1774
1775 questStatusData.ItemCount[i] = std::min(curitemcount, reqitemcount);
1776 m_QuestStatusSave[quest->GetQuestId()] = true;
1777 }
1778 }
1779 }
1780}
uint32 GetItemCount(uint32 item, bool inBankAlso=false, Item *skipItem=nullptr) const
Definition PlayerStorage.cpp:328

References GetItemCount(), Quest::GetQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatusSave, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by AddQuest().

◆ AnyVendorOptionAvailable()

bool Player::AnyVendorOptionAvailable ( uint32  menuId,
Creature const *  creature 
) const
private

Checks if any vendor option is available in the gossip menu tree for a given creature.

Parameters
menuIdThe starting gossip menu ID to check.
creaturePointer to the creature whose gossip menus are being checked.
Returns
true if a vendor option is available in any accessible menu; false otherwise.
14359{
14360 {
14361 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
14362 if (menuItemBounds.first == menuItemBounds.second)
14363 return true;
14364 }
14365
14366 std::set<uint32> visitedMenus;
14367 std::queue<uint32> menusToCheck;
14368 menusToCheck.push(menuId);
14369
14370 while (!menusToCheck.empty())
14371 {
14372 uint32 const currentMenuId = menusToCheck.front();
14373 menusToCheck.pop();
14374
14375 if (visitedMenus.find(currentMenuId) != visitedMenus.end())
14376 continue;
14377
14378 visitedMenus.insert(currentMenuId);
14379
14380 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(currentMenuId);
14381
14382 if (menuItemBounds.first == menuItemBounds.second && currentMenuId != 0)
14383 continue;
14384
14385 for (auto itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
14386 {
14387 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), itr->second.Conditions))
14388 continue;
14389
14390 if (itr->second.OptionType == GOSSIP_OPTION_VENDOR)
14391 return true;
14392 else if (itr->second.ActionMenuID)
14393 {
14394 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(itr->second.ActionMenuID);
14395 bool menuAccessible = false;
14396
14397 if (menuBounds.first == menuBounds.second)
14398 menuAccessible = true;
14399 else
14400 {
14401 for (auto menuItr = menuBounds.first; menuItr != menuBounds.second; ++menuItr)
14402 if (sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), menuItr->second.Conditions))
14403 {
14404 menuAccessible = true;
14405 break;
14406 }
14407 }
14408
14409 if (menuAccessible)
14410 menusToCheck.push(itr->second.ActionMenuID);
14411 }
14412 }
14413 }
14414
14415 return false;
14416}
#define sConditionMgr
Definition ConditionMgr.h:291
@ GOSSIP_OPTION_VENDOR
Definition GossipDef.h:38
std::pair< GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator > GossipMenusMapBounds
Definition ObjectMgr.h:631
std::pair< GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator > GossipMenuItemsMapBounds
Definition ObjectMgr.h:634
Definition Creature.h:47
Definition Player.h:1071

References GOSSIP_OPTION_VENDOR, sConditionMgr, and sObjectMgr.

Referenced by CanSeeVendor().

◆ ApplyEnchantment() [1/2]

void Player::ApplyEnchantment ( Item item,
bool  apply 
)
4298{
4299 for (uint32 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4300 ApplyEnchantment(item, EnchantmentSlot(slot), apply);
4301}

References ApplyEnchantment(), and MAX_ENCHANTMENT_SLOT.

◆ ApplyEnchantment() [2/2]

void Player::ApplyEnchantment ( Item item,
EnchantmentSlot  slot,
bool  apply,
bool  apply_dur = true,
bool  ignore_condition = false 
)
Deprecated:
item mods
4304{
4305 if (!item || !item->IsEquipped())
4306 return;
4307
4308 if (slot >= MAX_ENCHANTMENT_SLOT)
4309 return;
4310
4311 uint32 enchant_id = item->GetEnchantmentId(slot);
4312 if (!enchant_id)
4313 return;
4314
4315 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
4316 if (!pEnchant)
4317 return;
4318
4319 if (!ignore_condition && pEnchant->EnchantmentCondition && !EnchantmentFitsRequirements(pEnchant->EnchantmentCondition, -1))
4320 return;
4321
4322 if (pEnchant->requiredLevel > GetLevel())
4323 return;
4324
4325 if (pEnchant->requiredSkill > 0 && pEnchant->requiredSkillValue > GetSkillValue(pEnchant->requiredSkill))
4326 return;
4327
4328 if (!sScriptMgr->OnPlayerCanApplyEnchantment(this, item, slot, apply, apply_dur, ignore_condition))
4329 return;
4330
4331 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4332 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4334 && !item->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4335 {
4336 // Check if the requirements for the prismatic socket are met before applying the gem stats
4338 if (!pPrismaticEnchant || (pPrismaticEnchant->requiredSkill > 0 && pPrismaticEnchant->requiredSkillValue > GetSkillValue(pPrismaticEnchant->requiredSkill)))
4339 return;
4340 }
4341
4342 if (!item->IsBroken())
4343 {
4344 for (int s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
4345 {
4346 uint32 enchant_display_type = pEnchant->type[s];
4347 uint32 enchant_amount = pEnchant->amount[s];
4348 uint32 enchant_spell_id = pEnchant->spellid[s];
4349
4350 switch (enchant_display_type)
4351 {
4353 break;
4355 // processed in Player::CastItemCombatSpell
4356 break;
4358 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4359 HandleStatModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_VALUE, float(enchant_amount), apply);
4360 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4361 HandleStatModifier(UNIT_MOD_DAMAGE_OFFHAND, TOTAL_VALUE, float(enchant_amount), apply);
4362 else if (item->GetSlot() == EQUIPMENT_SLOT_RANGED)
4363 HandleStatModifier(UNIT_MOD_DAMAGE_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4364 break;
4366 if (enchant_spell_id)
4367 {
4368 if (apply)
4369 {
4370 int32 basepoints = 0;
4371 // Random Property Exist - try found basepoints for spell (basepoints depends from item suffix factor)
4372 if (item->GetItemRandomPropertyId())
4373 {
4374 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4375 if (item_rand)
4376 {
4377 // Search enchant_amount
4378 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4379 {
4380 if (item_rand->Enchantment[k] == enchant_id)
4381 {
4382 basepoints = int32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4383 break;
4384 }
4385 }
4386 }
4387 }
4388 // Cast custom spell vs all equal basepoints got from enchant_amount
4389 if (basepoints)
4390 CastCustomSpell(this, enchant_spell_id, &basepoints, &basepoints, &basepoints, true, item);
4391 else
4392 CastSpell(this, enchant_spell_id, true, item);
4393 }
4394 else
4395 RemoveAurasDueToItemSpell(enchant_spell_id, item->GetGUID());
4396 }
4397 break;
4399 if (!enchant_amount)
4400 {
4401 ItemRandomSuffixEntry const* item_rand = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4402 if (item_rand)
4403 {
4404 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4405 {
4406 if (item_rand->Enchantment[k] == enchant_id)
4407 {
4408 enchant_amount = uint32((item_rand->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4409 break;
4410 }
4411 }
4412 }
4413 }
4414
4415 HandleStatModifier(UnitMods(UNIT_MOD_RESISTANCE_START + enchant_spell_id), TOTAL_VALUE, float(enchant_amount), apply);
4416 break;
4418 {
4419 if (!enchant_amount)
4420 {
4421 ItemRandomSuffixEntry const* item_rand_suffix = sItemRandomSuffixStore.LookupEntry(std::abs(item->GetItemRandomPropertyId()));
4422 if (item_rand_suffix)
4423 {
4424 for (int k = 0; k < MAX_ITEM_ENCHANTMENT_EFFECTS; ++k)
4425 {
4426 if (item_rand_suffix->Enchantment[k] == enchant_id)
4427 {
4428 enchant_amount = uint32((item_rand_suffix->AllocationPct[k] * item->GetItemSuffixFactor()) / 10000);
4429 break;
4430 }
4431 }
4432 }
4433 }
4434
4435 sScriptMgr->OnPlayerApplyEnchantmentItemModsBefore(this, item, slot, apply, enchant_spell_id, enchant_amount);
4436
4437 LOG_DEBUG("entities.player.items", "Adding {} to stat nb {}", enchant_amount, enchant_spell_id);
4438 switch (enchant_spell_id)
4439 {
4440 case ITEM_MOD_MANA:
4441 LOG_DEBUG("entities.player.items", "+ {} MANA", enchant_amount);
4442 HandleStatModifier(UNIT_MOD_MANA, BASE_VALUE, float(enchant_amount), apply);
4443 break;
4444 case ITEM_MOD_HEALTH:
4445 LOG_DEBUG("entities.player.items", "+ {} HEALTH", enchant_amount);
4446 HandleStatModifier(UNIT_MOD_HEALTH, BASE_VALUE, float(enchant_amount), apply);
4447 break;
4448 case ITEM_MOD_AGILITY:
4449 LOG_DEBUG("entities.player.items", "+ {} AGILITY", enchant_amount);
4450 HandleStatModifier(UNIT_MOD_STAT_AGILITY, TOTAL_VALUE, float(enchant_amount), apply);
4451 ApplyStatBuffMod(STAT_AGILITY, (float)enchant_amount, apply);
4452 break;
4453 case ITEM_MOD_STRENGTH:
4454 LOG_DEBUG("entities.player.items", "+ {} STRENGTH", enchant_amount);
4455 HandleStatModifier(UNIT_MOD_STAT_STRENGTH, TOTAL_VALUE, float(enchant_amount), apply);
4456 ApplyStatBuffMod(STAT_STRENGTH, (float)enchant_amount, apply);
4457 break;
4458 case ITEM_MOD_INTELLECT:
4459 LOG_DEBUG("entities.player.items", "+ {} INTELLECT", enchant_amount);
4460 HandleStatModifier(UNIT_MOD_STAT_INTELLECT, TOTAL_VALUE, float(enchant_amount), apply);
4461 ApplyStatBuffMod(STAT_INTELLECT, (float)enchant_amount, apply);
4462 break;
4463 case ITEM_MOD_SPIRIT:
4464 LOG_DEBUG("entities.player.items", "+ {} SPIRIT", enchant_amount);
4465 HandleStatModifier(UNIT_MOD_STAT_SPIRIT, TOTAL_VALUE, float(enchant_amount), apply);
4466 ApplyStatBuffMod(STAT_SPIRIT, (float)enchant_amount, apply);
4467 break;
4468 case ITEM_MOD_STAMINA:
4469 LOG_DEBUG("entities.player.items", "+ {} STAMINA", enchant_amount);
4470 HandleStatModifier(UNIT_MOD_STAT_STAMINA, TOTAL_VALUE, float(enchant_amount), apply);
4471 ApplyStatBuffMod(STAT_STAMINA, (float)enchant_amount, apply);
4472 break;
4474 ApplyRatingMod(CR_DEFENSE_SKILL, enchant_amount, apply);
4475 LOG_DEBUG("entities.player.items", "+ {} DEFENCE", enchant_amount);
4476 break;
4478 ApplyRatingMod(CR_DODGE, enchant_amount, apply);
4479 LOG_DEBUG("entities.player.items", "+ {} DODGE", enchant_amount);
4480 break;
4482 ApplyRatingMod(CR_PARRY, enchant_amount, apply);
4483 LOG_DEBUG("entities.player.items", "+ {} PARRY", enchant_amount);
4484 break;
4486 ApplyRatingMod(CR_BLOCK, enchant_amount, apply);
4487 LOG_DEBUG("entities.player.items", "+ {} SHIELD_BLOCK", enchant_amount);
4488 break;
4490 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4491 LOG_DEBUG("entities.player.items", "+ {} MELEE_HIT", enchant_amount);
4492 break;
4494 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4495 LOG_DEBUG("entities.player.items", "+ {} RANGED_HIT", enchant_amount);
4496 break;
4498 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4499 LOG_DEBUG("entities.player.items", "+ {} SPELL_HIT", enchant_amount);
4500 break;
4502 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4503 LOG_DEBUG("entities.player.items", "+ {} MELEE_CRIT", enchant_amount);
4504 break;
4506 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4507 LOG_DEBUG("entities.player.items", "+ {} RANGED_CRIT", enchant_amount);
4508 break;
4510 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4511 LOG_DEBUG("entities.player.items", "+ {} SPELL_CRIT", enchant_amount);
4512 break;
4513 // Values from ITEM_STAT_MELEE_HA_RATING to ITEM_MOD_HASTE_RANGED_RATING are never used
4514 // in Enchantments
4515 // case ITEM_MOD_HIT_TAKEN_MELEE_RATING:
4516 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4517 // break;
4518 // case ITEM_MOD_HIT_TAKEN_RANGED_RATING:
4519 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4520 // break;
4521 // case ITEM_MOD_HIT_TAKEN_SPELL_RATING:
4522 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4523 // break;
4524 // case ITEM_MOD_CRIT_TAKEN_MELEE_RATING:
4525 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4526 // break;
4527 // case ITEM_MOD_CRIT_TAKEN_RANGED_RATING:
4528 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4529 // break;
4530 // case ITEM_MOD_CRIT_TAKEN_SPELL_RATING:
4531 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4532 // break;
4533 // case ITEM_MOD_HASTE_MELEE_RATING:
4534 // ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4535 // break;
4537 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4538 break;
4540 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4541 break;
4543 ApplyRatingMod(CR_HIT_MELEE, enchant_amount, apply);
4544 ApplyRatingMod(CR_HIT_RANGED, enchant_amount, apply);
4545 ApplyRatingMod(CR_HIT_SPELL, enchant_amount, apply);
4546 LOG_DEBUG("entities.player.items", "+ {} HIT", enchant_amount);
4547 break;
4549 ApplyRatingMod(CR_CRIT_MELEE, enchant_amount, apply);
4550 ApplyRatingMod(CR_CRIT_RANGED, enchant_amount, apply);
4551 ApplyRatingMod(CR_CRIT_SPELL, enchant_amount, apply);
4552 LOG_DEBUG("entities.player.items", "+ {} CRITICAL", enchant_amount);
4553 break;
4554 // Values ITEM_MOD_HIT_TAKEN_RATING and ITEM_MOD_CRIT_TAKEN_RATING are never used in Enchantment
4555 // case ITEM_MOD_HIT_TAKEN_RATING:
4556 // ApplyRatingMod(CR_HIT_TAKEN_MELEE, enchant_amount, apply);
4557 // ApplyRatingMod(CR_HIT_TAKEN_RANGED, enchant_amount, apply);
4558 // ApplyRatingMod(CR_HIT_TAKEN_SPELL, enchant_amount, apply);
4559 // break;
4560 // case ITEM_MOD_CRIT_TAKEN_RATING:
4561 // ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4562 // ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4563 // ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4564 // break;
4566 ApplyRatingMod(CR_CRIT_TAKEN_MELEE, enchant_amount, apply);
4567 ApplyRatingMod(CR_CRIT_TAKEN_RANGED, enchant_amount, apply);
4568 ApplyRatingMod(CR_CRIT_TAKEN_SPELL, enchant_amount, apply);
4569 LOG_DEBUG("entities.player.items", "+ {} RESILIENCE", enchant_amount);
4570 break;
4572 ApplyRatingMod(CR_HASTE_MELEE, enchant_amount, apply);
4573 ApplyRatingMod(CR_HASTE_RANGED, enchant_amount, apply);
4574 ApplyRatingMod(CR_HASTE_SPELL, enchant_amount, apply);
4575 LOG_DEBUG("entities.player.items", "+ {} HASTE", enchant_amount);
4576 break;
4578 ApplyRatingMod(CR_EXPERTISE, enchant_amount, apply);
4579 LOG_DEBUG("entities.player.items", "+ {} EXPERTISE", enchant_amount);
4580 break;
4582 HandleStatModifier(UNIT_MOD_ATTACK_POWER, TOTAL_VALUE, float(enchant_amount), apply);
4583 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4584 LOG_DEBUG("entities.player.items", "+ {} ATTACK_POWER", enchant_amount);
4585 break;
4587 HandleStatModifier(UNIT_MOD_ATTACK_POWER_RANGED, TOTAL_VALUE, float(enchant_amount), apply);
4588 LOG_DEBUG("entities.player.items", "+ {} RANGED_ATTACK_POWER", enchant_amount);
4589 break;
4590 // case ITEM_MOD_FERAL_ATTACK_POWER:
4591 // ApplyFeralAPBonus(enchant_amount, apply);
4592 // LOG_DEBUG("entities.player.items", "+ {} FERAL_ATTACK_POWER", enchant_amount);
4593 // break;
4595 ApplyManaRegenBonus(enchant_amount, apply);
4596 LOG_DEBUG("entities.player.items", "+ {} MANA_REGENERATION", enchant_amount);
4597 break;
4599 ApplyRatingMod(CR_ARMOR_PENETRATION, enchant_amount, apply);
4600 LOG_DEBUG("entities.player.items", "+ {} ARMOR PENETRATION", enchant_amount);
4601 break;
4603 ApplySpellPowerBonus(enchant_amount, apply);
4604 LOG_DEBUG("entities.player.items", "+ {} SPELL_POWER", enchant_amount);
4605 break;
4607 ApplyHealthRegenBonus(enchant_amount, apply);
4608 LOG_DEBUG("entities.player.items", "+ {} HEALTH_REGENERATION", enchant_amount);
4609 break;
4611 ApplySpellPenetrationBonus(enchant_amount, apply);
4612 LOG_DEBUG("entities.player.items", "+ {} SPELL_PENETRATION", enchant_amount);
4613 break;
4615 HandleBaseModValue(SHIELD_BLOCK_VALUE, FLAT_MOD, float(enchant_amount), apply);
4616 LOG_DEBUG("entities.player.items", "+ {} BLOCK_VALUE", enchant_amount);
4617 break;
4620 ApplySpellHealingBonus(enchant_amount, apply);
4621 LOG_DEBUG("entities.player.items", "+ {} SPELL_HEALING", enchant_amount);
4622 break;
4624 ApplySpellDamageBonus(enchant_amount, apply);
4625 LOG_DEBUG("entities.player.items", "+ {} SPELL_DAMAGE", enchant_amount);
4626 break;
4627 default:
4628 break;
4629 }
4630 break;
4631 }
4632 case ITEM_ENCHANTMENT_TYPE_TOTEM: // Shaman Rockbiter Weapon
4633 {
4635 {
4636 float addValue = 0.0f;
4637 if (item->GetSlot() == EQUIPMENT_SLOT_MAINHAND)
4638 {
4639 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4641 }
4642 else if (item->GetSlot() == EQUIPMENT_SLOT_OFFHAND)
4643 {
4644 addValue = float(enchant_amount * item->GetTemplate()->Delay / 1000.0f);
4646 }
4647 }
4648 break;
4649 }
4651 // processed in Player::CastItemUseSpell
4652 break;
4654 // nothing do..
4655 break;
4656 default:
4657 LOG_ERROR("entities.player", "Unknown item enchantment (id = {}) display type: {}", enchant_id, enchant_display_type);
4658 break;
4659 } /*switch (enchant_display_type)*/
4660 } /*for*/
4661 }
4662
4663 // visualize enchantment at player and equipped items
4664 if (slot == PERM_ENCHANTMENT_SLOT)
4665 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0);
4666
4667 if (slot == TEMP_ENCHANTMENT_SLOT)
4668 SetUInt16Value(PLAYER_VISIBLE_ITEM_1_ENCHANTMENT + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0);
4669
4670 if (apply_dur)
4671 {
4672 if (apply)
4673 {
4674 // set duration
4675 uint32 duration = item->GetEnchantmentDuration(slot);
4676 if (duration > 0)
4677 AddEnchantmentDuration(item, slot, duration);
4678 }
4679 else
4680 {
4681 // duration == 0 will remove EnchantDuration
4682 AddEnchantmentDuration(item, slot, 0);
4683 }
4684 }
4685}
@ ITEM_ENCHANTMENT_TYPE_DAMAGE
Definition DBCEnums.h:368
@ ITEM_ENCHANTMENT_TYPE_USE_SPELL
Definition DBCEnums.h:373
@ ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL
Definition DBCEnums.h:367
@ ITEM_ENCHANTMENT_TYPE_STAT
Definition DBCEnums.h:371
@ ITEM_ENCHANTMENT_TYPE_RESISTANCE
Definition DBCEnums.h:370
@ ITEM_ENCHANTMENT_TYPE_NONE
Definition DBCEnums.h:366
@ ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL
Definition DBCEnums.h:369
@ ITEM_ENCHANTMENT_TYPE_TOTEM
Definition DBCEnums.h:372
@ ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET
Definition DBCEnums.h:374
DBCStorage< SpellItemEnchantmentEntry > sSpellItemEnchantmentStore(SpellItemEnchantmentfmt)
DBCStorage< ItemRandomSuffixEntry > sItemRandomSuffixStore(ItemRandomSuffixfmt)
#define MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS
Definition DBCStructure.h:1839
#define MAX_ITEM_ENCHANTMENT_EFFECTS
Definition DBCStructure.h:1205
@ PERM_ENCHANTMENT_SLOT
Definition Item.h:169
@ SOCK_ENCHANTMENT_SLOT_3
Definition Item.h:173
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
@ SOCK_ENCHANTMENT_SLOT_2
Definition Item.h:172
@ PRISMATIC_ENCHANTMENT_SLOT
Definition Item.h:175
@ SOCK_ENCHANTMENT_SLOT
Definition Item.h:171
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ UNIT_MOD_RESISTANCE_START
Definition Unit.h:174
@ PLAYER_VISIBLE_ITEM_1_ENCHANTMENT
Definition UpdateFields.h:287
int32 GetItemRandomPropertyId() const
Definition Item.h:295
uint32 GetItemSuffixFactor() const
Definition Item.h:296
bool IsEquipped() const
Definition Item.cpp:789
void SetUInt16Value(uint16 index, uint8 offset, uint16 value)
Definition Object.cpp:759
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5469
bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot)
Definition Player.cpp:11141
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1251
void RemoveAurasDueToItemSpell(uint32 spellId, ObjectGuid castItemGuid)
Definition Unit.cpp:5153
Definition DBCStructure.h:1218
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > AllocationPct
Definition DBCStructure.h:1225
std::array< uint32, MAX_ITEM_ENCHANTMENT_EFFECTS > Enchantment
Definition DBCStructure.h:1223
uint32 Delay
Definition ItemTemplate.h:659
_Socket Socket[MAX_ITEM_PROTO_SOCKETS]
Definition ItemTemplate.h:681
Definition DBCStructure.h:1842
uint32 EnchantmentCondition
Definition DBCStructure.h:1854
uint32 amount[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition DBCStructure.h:1846
uint32 requiredLevel
Definition DBCStructure.h:1857
uint32 spellid[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition DBCStructure.h:1848
uint32 requiredSkill
Definition DBCStructure.h:1855
uint32 requiredSkillValue
Definition DBCStructure.h:1856
uint32 type[MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS]
Definition DBCStructure.h:1845
uint32 Color
Definition ItemTemplate.h:602

References AddEnchantmentDuration(), ItemRandomSuffixEntry::AllocationPct, SpellItemEnchantmentEntry::amount, ApplyHealthRegenBonus(), ApplyManaRegenBonus(), ApplyRatingMod(), ApplySpellDamageBonus(), ApplySpellHealingBonus(), ApplySpellPenetrationBonus(), ApplySpellPowerBonus(), Unit::ApplyStatBuffMod(), BASE_VALUE, Unit::CastCustomSpell(), Unit::CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_SHAMAN, _Socket::Color, CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_PARRY, ItemTemplate::Delay, ItemRandomSuffixEntry::Enchantment, SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, FLAT_MOD, Item::GetEnchantmentDuration(), Item::GetEnchantmentId(), Object::GetGUID(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Unit::GetLevel(), GetSkillValue(), Item::GetSlot(), Item::GetTemplate(), HandleBaseModValue(), Unit::HandleStatModifier(), Item::IsBroken(), IsClass(), Item::IsEquipped(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_ENCHANTMENT_TYPE_DAMAGE, ITEM_ENCHANTMENT_TYPE_EQUIP_SPELL, ITEM_ENCHANTMENT_TYPE_NONE, ITEM_ENCHANTMENT_TYPE_PRISMATIC_SOCKET, ITEM_ENCHANTMENT_TYPE_RESISTANCE, ITEM_ENCHANTMENT_TYPE_STAT, ITEM_ENCHANTMENT_TYPE_TOTEM, ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_MOD_AGILITY, ITEM_MOD_ARMOR_PENETRATION_RATING, ITEM_MOD_ATTACK_POWER, ITEM_MOD_BLOCK_RATING, ITEM_MOD_BLOCK_VALUE, ITEM_MOD_CRIT_MELEE_RATING, ITEM_MOD_CRIT_RANGED_RATING, ITEM_MOD_CRIT_RATING, ITEM_MOD_CRIT_SPELL_RATING, ITEM_MOD_DEFENSE_SKILL_RATING, ITEM_MOD_DODGE_RATING, ITEM_MOD_EXPERTISE_RATING, ITEM_MOD_HASTE_RANGED_RATING, ITEM_MOD_HASTE_RATING, ITEM_MOD_HASTE_SPELL_RATING, ITEM_MOD_HEALTH, ITEM_MOD_HEALTH_REGEN, ITEM_MOD_HIT_MELEE_RATING, ITEM_MOD_HIT_RANGED_RATING, ITEM_MOD_HIT_RATING, ITEM_MOD_HIT_SPELL_RATING, ITEM_MOD_INTELLECT, ITEM_MOD_MANA, ITEM_MOD_MANA_REGENERATION, ITEM_MOD_PARRY_RATING, ITEM_MOD_RANGED_ATTACK_POWER, ITEM_MOD_RESILIENCE_RATING, ITEM_MOD_SPELL_DAMAGE_DONE, ITEM_MOD_SPELL_HEALING_DONE, ITEM_MOD_SPELL_PENETRATION, ITEM_MOD_SPELL_POWER, ITEM_MOD_SPIRIT, ITEM_MOD_STAMINA, ITEM_MOD_STRENGTH, LOG_DEBUG, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_ENCHANTMENT_EFFECTS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, PERM_ENCHANTMENT_SLOT, PLAYER_VISIBLE_ITEM_1_ENCHANTMENT, PRISMATIC_ENCHANTMENT_SLOT, Unit::RemoveAurasDueToItemSpell(), SpellItemEnchantmentEntry::requiredLevel, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, Object::SetUInt16Value(), SHIELD_BLOCK_VALUE, sItemRandomSuffixStore, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, ItemTemplate::Socket, SpellItemEnchantmentEntry::spellid, sScriptMgr, sSpellItemEnchantmentStore, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, TEMP_ENCHANTMENT_SLOT, TOTAL_VALUE, SpellItemEnchantmentEntry::type, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RESISTANCE_START, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), ApplyEnchantment(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Spell::EffectEnchantHeldItem(), Spell::EffectEnchantItemPerm(), Spell::EffectEnchantItemPrismatic(), Spell::EffectEnchantItemTmp(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleCancelTempEnchantmentOpcode(), WorldSession::HandleSocketOpcode(), RemoveArenaEnchantments(), SetVirtualItemSlot(), SwapItem(), ToggleMetaGemsActive(), UpdateEnchantTime(), and UpdateSkillEnchantments().

◆ ApplyEquipCooldown()

void Player::ApplyEquipCooldown ( Item pItem)
11822{
11824 return;
11825
11826 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
11827 {
11828 _Spell const& spellData = pItem->GetTemplate()->Spells[i];
11829
11830 // no spell
11831 if (!spellData.SpellId)
11832 continue;
11833
11834 // xinef: apply hidden cooldown for procs
11836 {
11837 // xinef: uint32(-1) special marker for proc cooldowns
11838 AddSpellCooldown(spellData.SpellId, uint32(-1), 30 * IN_MILLISECONDS);
11839 continue;
11840 }
11841
11842 // wrong triggering type (note: ITEM_SPELLTRIGGER_ON_NO_DELAY_USE not have cooldown)
11843 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
11844 continue;
11845
11846 // xinef: dont apply equip cooldown if spell on item has insignificant cooldown
11847 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
11848 if (spellData.SpellCooldown <= 3000 && spellData.SpellCategoryCooldown <= 3000 && (!spellInfo || (spellInfo->RecoveryTime <= 3000 && spellInfo->CategoryRecoveryTime <= 3000)))
11849 continue;
11850
11851 // Don't replace longer cooldowns by equip cooldown if we have any.
11852 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellData.SpellId);
11853 if (itr != m_spellCooldowns.end() && itr->second.itemid == pItem->GetEntry() && itr->second.end > GameTime::GetGameTimeMS().count() + 30 * IN_MILLISECONDS)
11854 continue;
11855
11856 // xinef: dont apply eqiup cooldown for spells with this attribute
11857 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL))
11858 continue;
11859
11860 AddSpellCooldown(spellData.SpellId, pItem->GetEntry(), 30 * IN_MILLISECONDS, true, true);
11861
11863 data << pItem->GetGUID();
11864 data << uint32(spellData.SpellId);
11865 SendDirectMessage(&data);
11866 }
11867}
@ ITEM_SPELLTRIGGER_ON_USE
Definition ItemTemplate.h:77
@ ITEM_SPELLTRIGGER_ON_EQUIP
Definition ItemTemplate.h:78
@ ITEM_FLAG_NO_EQUIP_COOLDOWN
Definition ItemTemplate.h:154
#define MAX_ITEM_PROTO_SPELLS
Definition ItemTemplate.h:615
@ SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL
Definition SharedDefines.h:421
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11107
uint32 RecoveryTime
Definition SpellInfo.h:348
uint32 CategoryRecoveryTime
Definition SpellInfo.h:349
@ SMSG_ITEM_COOLDOWN
Definition Opcodes.h:206
_Spell Spells[MAX_ITEM_PROTO_SPELLS]
Definition ItemTemplate.h:662
Definition ItemTemplate.h:590
uint32 SpellTrigger
Definition ItemTemplate.h:592
int32 SpellCategoryCooldown
Definition ItemTemplate.h:597
int32 SpellCooldown
Definition ItemTemplate.h:595
int32 SpellId
Definition ItemTemplate.h:591

References AddSpellCooldown(), SpellInfo::CategoryRecoveryTime, Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), Item::GetTemplate(), SpellInfo::HasAttribute(), ItemTemplate::HasFlag(), IN_MILLISECONDS, ITEM_FLAG_NO_EQUIP_COOLDOWN, ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, m_spellCooldowns, MAX_ITEM_PROTO_SPELLS, SpellInfo::RecoveryTime, SendDirectMessage(), SMSG_ITEM_COOLDOWN, SPELL_ATTR0_NOT_IN_COMBAT_ONLY_PEACEFUL, _Spell::SpellCategoryCooldown, _Spell::SpellCooldown, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, and sSpellMgr.

Referenced by EquipItem().

◆ ApplyEquipSpell()

void Player::ApplyEquipSpell ( SpellInfo const *  spellInfo,
Item item,
bool  apply,
bool  form_change = false 
)
7216{
7217 if (apply)
7218 {
7219 if (!sScriptMgr->OnPlayerCanApplyEquipSpell(this, spellInfo, item, apply, form_change))
7220 return;
7221
7222 // Cannot be used in this stance/form
7223 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) != SPELL_CAST_OK)
7224 return;
7225
7226 if (form_change) // check aura active state from other form
7227 {
7228 AuraApplicationMapBounds range = GetAppliedAuras().equal_range(spellInfo->Id);
7229 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
7230 if (!item || itr->second->GetBase()->GetCastItemGUID() == item->GetGUID())
7231 return;
7232 }
7233
7234 LOG_DEBUG("entities.player", "WORLD: cast {} Equip spellId - {}", (item ? "item" : "itemset"), spellInfo->Id);
7235
7236 CastSpell(this, spellInfo, true, item);
7237 }
7238 else
7239 {
7240 if (form_change) // check aura compatibility
7241 {
7242 // Cannot be used in this stance/form
7243 if (spellInfo->CheckShapeshift(GetShapeshiftForm()) == SPELL_CAST_OK)
7244 return; // and remove only not compatible at form change
7245 }
7246
7247 if (item)
7248 RemoveAurasDueToItemSpell(spellInfo->Id, item->GetGUID()); // un-apply all spells, not only at-equipped
7249 else
7250 RemoveAurasDueToSpell(spellInfo->Id); // un-apply spell (item set case)
7251 }
7252}
@ SPELL_CAST_OK
Definition SharedDefines.h:1149
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1911
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:660
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1346

References Unit::CastSpell(), SpellInfo::CheckShapeshift(), Unit::GetAppliedAuras(), Object::GetGUID(), Unit::GetShapeshiftForm(), SpellInfo::Id, LOG_DEBUG, Unit::RemoveAurasDueToItemSpell(), Unit::RemoveAurasDueToSpell(), SPELL_CAST_OK, and sScriptMgr.

Referenced by AddItemsSetItem(), ApplyItemEquipSpell(), RemoveItemsSetItem(), and UpdateEquipSpellsAtFormChange().

◆ ApplyFeralAPBonus()

void Player::ApplyFeralAPBonus ( int32  amount,
bool  apply 
)
342{
343 _ModifyUInt32(apply, m_baseFeralAP, amount);
345}
bool _ModifyUInt32(bool apply, uint32 &baseValue, int32 &amount)
Definition StatSystem.cpp:28
void UpdateAttackPowerAndDamage(bool ranged=false) override
Definition StatSystem.cpp:347

References _ModifyUInt32(), m_baseFeralAP, and UpdateAttackPowerAndDamage().

Referenced by _ApplyItemBonuses().

◆ ApplyHealthRegenBonus()

void Player::ApplyHealthRegenBonus ( int32  amount,
bool  apply 
)
939{
940 _ModifyUInt32(apply, m_baseHealthRegen, amount);
941}

References _ModifyUInt32(), and m_baseHealthRegen.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyItemEquipSpell()

void Player::ApplyItemEquipSpell ( Item item,
bool  apply,
bool  form_change = false 
)
7176{
7177 if (!item)
7178 return;
7179
7180 ItemTemplate const* proto = item->GetTemplate();
7181 if (!proto)
7182 return;
7183
7184 for (auto const& spellData : proto->Spells)
7185 {
7186 // no spell
7187 if (!spellData.SpellId)
7188 continue;
7189
7190 // wrong triggering type
7191 if (apply)
7192 {
7193 // Only apply "On Equip" spells
7194 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
7195 continue;
7196 }
7197 else
7198 {
7199 // Do not remove "Use" spells in these special cases:
7200 // 1. During form changes (e.g., druid shapeshifting)
7201 // 2. When the spell comes from an item with negative charges, which means its effect should persist after the item is consumed or removed.
7202 if (spellData.SpellTrigger == ITEM_SPELLTRIGGER_ON_USE && (form_change || spellData.SpellCharges < 0))
7203 continue;
7204 }
7205
7206 // check if it is valid spell
7207 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(spellData.SpellId);
7208 if (!spellproto)
7209 continue;
7210
7211 ApplyEquipSpell(spellproto, item, apply, form_change);
7212 }
7213}
Spells
Definition BattlegroundIC.h:712
void ApplyEquipSpell(SpellInfo const *spellInfo, Item *item, bool apply, bool form_change=false)
Definition Player.cpp:7215

References ApplyEquipSpell(), Item::GetTemplate(), ITEM_SPELLTRIGGER_ON_EQUIP, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::Spells, and sSpellMgr.

Referenced by _ApplyAllItemMods(), _ApplyItemMods(), _RemoveAllItemMods(), and UpdateEquipSpellsAtFormChange().

◆ ApplyItemObtainSpells()

void Player::ApplyItemObtainSpells ( Item item,
bool  apply 
)
7032{
7033 ItemTemplate const* itemTemplate = item->GetTemplate();
7034 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7035 {
7036 if (itemTemplate->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_NO_DELAY_USE) // On obtain trigger
7037 continue;
7038
7039 int32 const spellId = itemTemplate->Spells[i].SpellId;
7040 if (spellId <= 0)
7041 continue;
7042
7043 if (apply)
7044 {
7045 if (!HasAura(spellId))
7046 CastSpell(this, spellId, true, item);
7047 }
7048 else
7049 RemoveAurasDueToSpell(spellId);
7050 }
7051}
@ ITEM_SPELLTRIGGER_ON_NO_DELAY_USE
Definition ItemTemplate.h:87
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5789

References Unit::CastSpell(), Item::GetTemplate(), Unit::HasAura(), ITEM_SPELLTRIGGER_ON_NO_DELAY_USE, MAX_ITEM_PROTO_SPELLS, Unit::RemoveAurasDueToSpell(), _Spell::SpellId, ItemTemplate::Spells, and _Spell::SpellTrigger.

Referenced by CastAllObtainSpells(), DestroyItem(), RemoveItem(), and UpdateItemObtainSpells().

◆ ApplyManaRegenBonus()

void Player::ApplyManaRegenBonus ( int32  amount,
bool  apply 
)
933{
934 _ModifyUInt32(apply, m_baseManaRegen, amount);
936}
void UpdateManaRegen()
Definition StatSystem.cpp:943

References _ModifyUInt32(), m_baseManaRegen, and UpdateManaRegen().

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplyRatingMod()

void Player::ApplyRatingMod ( CombatRating  cr,
int32  value,
bool  apply 
)
5279{
5280 float oldRating = m_baseRatingValue[cr];
5281 m_baseRatingValue[cr] += (apply ? value : -value);
5282 // explicit affected values
5283 if (cr == CR_HASTE_MELEE || cr == CR_HASTE_RANGED || cr == CR_HASTE_SPELL)
5284 {
5285 float const mult = GetRatingMultiplier(cr);
5286 float const oldVal = oldRating * mult;
5287 float const newVal = m_baseRatingValue[cr] * mult;
5288 switch (cr)
5289 {
5290 case CR_HASTE_MELEE:
5291 ApplyAttackTimePercentMod(BASE_ATTACK, oldVal, false);
5292 ApplyAttackTimePercentMod(OFF_ATTACK, oldVal, false);
5295 break;
5296 case CR_HASTE_RANGED:
5299 break;
5300 case CR_HASTE_SPELL:
5301 ApplyCastTimePercentMod(oldVal, false);
5302 ApplyCastTimePercentMod(newVal, true);
5303 break;
5304 default:
5305 break;
5306 }
5307 }
5308
5309 UpdateRating(cr);
5310}
float GetRatingMultiplier(CombatRating cr) const
Definition Player.cpp:5201
void UpdateRating(CombatRating cr)
Definition PlayerUpdates.cpp:610
void ApplyAttackTimePercentMod(WeaponAttackType att, float val, bool apply)
Definition Unit.cpp:17080
void ApplyCastTimePercentMod(float val, bool apply)
Definition Unit.cpp:17096

References Unit::ApplyAttackTimePercentMod(), Unit::ApplyCastTimePercentMod(), BASE_ATTACK, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, GetRatingMultiplier(), m_baseRatingValue, OFF_ATTACK, RANGED_ATTACK, and UpdateRating().

Referenced by _ApplyItemBonuses(), ApplyEnchantment(), AuraEffect::HandleModRating(), AuraEffect::HandleModRatingFromStat(), spell_dru_rejuvenation_moonglade_2_set::OnApply(), spell_dru_rejuvenation_moonglade_2_set::OnRemove(), RecalculateRating(), and UpdateStats().

◆ ApplySpellDamageBonus()

void Player::ApplySpellDamageBonus ( int32  amount,
bool  apply 
)
178{
179 apply = _ModifyUInt32(apply, m_baseSpellDamage, amount);
180
181 // For speed just update for client
182 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
184}
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:295
void ApplyModInt32Value(uint16 index, int32 val, bool apply)
Definition Object.cpp:804

References _ModifyUInt32(), Object::ApplyModInt32Value(), m_baseSpellDamage, MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, and SPELL_SCHOOL_HOLY.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellHealingBonus()

void Player::ApplySpellHealingBonus ( int32  amount,
bool  apply 
)
187{
188 apply = _ModifyUInt32(apply, m_baseSpellHealing, amount);
189
190 // For speed just update for client
192}
@ PLAYER_FIELD_MOD_HEALING_DONE_POS
Definition UpdateFields.h:363

References _ModifyUInt32(), Object::ApplyModUInt32Value(), m_baseSpellHealing, and PLAYER_FIELD_MOD_HEALING_DONE_POS.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellMod()

template<class T >
template AC_GAME_API void Player::ApplySpellMod ( uint32  spellId,
SpellModOp  op,
T &  basevalue,
Spell spell = nullptr,
bool  temporaryPet = false 
)
9814{
9815 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9816 if (!spellInfo)
9817 return;
9818
9819 float totalmul = 1.0f;
9820 int32 totalflat = 0;
9821
9822 auto calculateSpellMod = [&](SpellModifier* mod)
9823 {
9824 // xinef: temporary pets cannot use charged mods of owner, needed for mirror image QQ they should use their own auras
9825 if (temporaryPet && mod->charges != 0)
9826 return;
9827
9828 // skip if already instant or cost is free
9829 if (mod->op == SPELLMOD_CASTING_TIME || mod->op == SPELLMOD_COST)
9830 if (((float)basevalue + (float)basevalue * (totalmul - 1.0f) + (float)totalflat) <= 0)
9831 return;
9832
9833 if (mod->type == SPELLMOD_FLAT)
9834 {
9835 // xinef: do not allow to consume more than one 100% crit increasing spell
9836 if (mod->op == SPELLMOD_CRITICAL_CHANCE && totalflat >= 100)
9837 return;
9838
9839 int32 flatValue = mod->value;
9840
9841 // SPELL_MOD_THREAT - divide by 100 (in packets we send threat * 100)
9842 if (mod->op == SPELLMOD_THREAT)
9843 flatValue /= 100;
9844
9845 totalflat += flatValue;
9846 }
9847 else if (mod->type == SPELLMOD_PCT)
9848 {
9849 // skip percent mods for null basevalue (most important for spell mods with charges)
9850 if (basevalue == T(0) || totalmul == 0.0f)
9851 return;
9852
9853 // special case (skip > 10sec spell casts for instant cast setting)
9854 if (mod->op == SPELLMOD_CASTING_TIME && basevalue >= T(10000) && mod->value <= -100)
9855 return;
9856 // xinef: special exception for surge of light, dont affect crit chance if previous mods were not applied
9857 else if (mod->op == SPELLMOD_CRITICAL_CHANCE && spell && !HasSpellMod(mod, spell))
9858 return;
9859 // xinef: special case for backdraft gcd reduce with backlast time reduction, dont affect gcd if cast time was not applied
9860 else if (mod->op == SPELLMOD_GLOBAL_COOLDOWN && spell && !HasSpellMod(mod, spell))
9861 return;
9862
9863 // xinef: those two mods should be multiplicative (Glyph of Renew)
9864 if (mod->op == SPELLMOD_DAMAGE || mod->op == SPELLMOD_DOT)
9865 totalmul *= CalculatePct(1.0f, 100.0f + mod->value);
9866 else
9867 totalmul += CalculatePct(1.0f, mod->value);
9868 }
9869
9870 DropModCharge(mod, spell);
9871 };
9872
9873 // Drop charges for triggering spells instead of triggered ones
9875 spell = m_spellModTakingSpell;
9876
9877 for (auto mod : m_spellMods[op])
9878 {
9879 // Charges can be set only for mods with auras
9880 if (!mod->ownerAura)
9881 ASSERT(!mod->charges);
9882
9883 if (!IsAffectedBySpellmod(spellInfo, mod, spell))
9884 continue;
9885
9886 calculateSpellMod(mod);
9887 }
9888
9889 if (op == SPELLMOD_CASTING_TIME || op == SPELLMOD_DURATION)
9890 basevalue = (basevalue + totalflat) > 0 ? (basevalue + totalflat) * totalmul : 0;
9891 else
9892 basevalue = (basevalue * totalmul) + totalflat;
9893}
@ SPELLMOD_PCT
Definition Player.h:95
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ SPELLMOD_GLOBAL_COOLDOWN
Definition SpellDefines.h:97
@ SPELLMOD_THREAT
Definition SpellDefines.h:78
@ SPELLMOD_DURATION
Definition SpellDefines.h:77
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
@ SPELLMOD_COST
Definition SpellDefines.h:90
T CalculatePct(T base, U pct)
Definition Util.h:61
void DropModCharge(SpellModifier *mod, Spell *spell)
Definition Player.cpp:10096
bool HasSpellMod(SpellModifier *mod, Spell *spell)
Definition Player.cpp:9788
bool IsAffectedBySpellmod(SpellInfo const *spellInfo, SpellModifier *mod, Spell *spell=nullptr)
Definition Player.cpp:9796
Definition Player.h:182

References ASSERT, CalculatePct(), DropModCharge(), HasSpellMod(), IsAffectedBySpellmod(), m_spellMods, m_spellModTakingSpell, SPELLMOD_CASTING_TIME, SPELLMOD_COST, SPELLMOD_CRITICAL_CHANCE, SPELLMOD_DAMAGE, SPELLMOD_DOT, SPELLMOD_DURATION, SPELLMOD_FLAT, SPELLMOD_GLOBAL_COOLDOWN, SPELLMOD_PCT, SPELLMOD_THREAT, and sSpellMgr.

Referenced by AddSpellAndCategoryCooldowns(), Aura::CalcMaxDuration(), AuraEffect::CalculatePeriodic(), CastItemCombatSpell(), Spell::Delayed(), Spell::DelayedChannel(), and Spell::TriggerGlobalCooldown().

◆ ApplySpellPenetrationBonus()

void Player::ApplySpellPenetrationBonus ( int32  amount,
bool  apply 
)
237{
239 m_spellPenetrationItemMod += apply ? amount : -amount;
240}
@ PLAYER_FIELD_MOD_TARGET_RESISTANCE
Definition UpdateFields.h:366

References Object::ApplyModInt32Value(), m_spellPenetrationItemMod, and PLAYER_FIELD_MOD_TARGET_RESISTANCE.

Referenced by _ApplyItemBonuses(), and ApplyEnchantment().

◆ ApplySpellPowerBonus()

void Player::ApplySpellPowerBonus ( int32  amount,
bool  apply 
)

◆ AreaExploredOrEventHappens()

void Player::AreaExploredOrEventHappens ( uint32  questId)
1792{
1793 if (questId)
1794 {
1795 uint16 log_slot = FindQuestSlot(questId);
1796 QuestStatusData* q_status = nullptr;
1797 if (log_slot < MAX_QUEST_LOG_SIZE)
1798 {
1799 q_status = &m_QuestStatus[questId];
1800
1801 // xinef: added failed check
1802 if (!q_status->Explored && q_status->Status != QUEST_STATUS_FAILED)
1803 {
1804 q_status->Explored = true;
1805 m_QuestStatusSave[questId] = true;
1806
1807 SendQuestComplete(questId);
1808 }
1809 }
1810 if (CanCompleteQuest(questId, q_status))
1811 CompleteQuest(questId);
1812 else
1814 }
1815}
@ ADDITIONAL_SAVING_QUEST_STATUS
Definition Player.h:988
void SendQuestComplete(uint32 quest_id)
Definition PlayerQuest.cpp:2346
void AdditionalSavingAddMask(uint8 mask)
Definition Player.h:2574

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::Explored, FindQuestSlot(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_STATUS_FAILED, SendQuestComplete(), and QuestStatusData::Status.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), Spell::EffectQuestComplete(), SmartAI::EndPath(), dragonmaw_race_npc::FinishRace(), go_ahune_ice_stone::GossipSelect(), GroupEventHappens(), WorldSession::HandleAreaTriggerOpcode(), boss_alar::JustDied(), go_table_theka::OnGossipHello(), npc_parqual_fintallas::OnGossipSelect(), npc_great_bear_spirit::OnGossipSelect(), npc_thrall_warchief::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_stone_watcher_of_norgannon::OnGossipSelect(), npc_vekjik::OnGossipSelect(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), npc_doctor::npc_doctorAI::PatientSaved(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), and npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI().

◆ AutoStoreLoot() [1/2]

void Player::AutoStoreLoot ( uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
inline
1314{ AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const &store, bool broadcast=false)
Definition Player.cpp:13536

References AutoStoreLoot(), NULL_BAG, and NULL_SLOT.

Referenced by AutoStoreLoot().

◆ AutoStoreLoot() [2/2]

void Player::AutoStoreLoot ( uint8  bag,
uint8  slot,
uint32  loot_id,
LootStore const &  store,
bool  broadcast = false 
)
13537{
13538 Loot loot;
13539 loot.FillLoot (loot_id, store, this, true);
13540
13541 uint32 max_slot = loot.GetMaxSlotInLootFor(this);
13542 for (uint32 i = 0; i < max_slot; ++i)
13543 {
13544 LootItem* lootItem = loot.LootItemInSlot(i, this);
13545
13546 ItemPosCountVec dest;
13547 InventoryResult msg = CanStoreNewItem(bag, slot, dest, lootItem->itemid, lootItem->count);
13548 if (msg != EQUIP_ERR_OK && slot != NULL_SLOT)
13549 msg = CanStoreNewItem(bag, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13550 if (msg != EQUIP_ERR_OK && bag != NULL_BAG)
13551 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, lootItem->itemid, lootItem->count);
13552 if (msg != EQUIP_ERR_OK)
13553 {
13554 SendEquipError(msg, nullptr, nullptr, lootItem->itemid);
13555 continue;
13556 }
13557
13558 Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
13559 SendNewItem(pItem, lootItem->count, false, false, broadcast);
13560 }
13561}
Definition LootMgr.h:154
uint32 itemid
Definition LootMgr.h:155
int32 randomPropertyId
Definition LootMgr.h:158
uint8 count
Definition LootMgr.h:162
Definition LootMgr.h:313
uint32 GetMaxSlotInLootFor(Player *player) const
Definition LootMgr.cpp:916
LootItem * LootItemInSlot(uint32 lootslot, Player *player, QuestItem **qitem=nullptr, QuestItem **ffaitem=nullptr, QuestItem **conditem=nullptr)
Definition LootMgr.cpp:851
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571

References CanStoreNewItem(), LootItem::count, EQUIP_ERR_OK, Loot::FillLoot(), Loot::GetMaxSlotInLootFor(), LootItem::itemid, Loot::LootItemInSlot(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by Group::CountTheRoll(), Spell::EffectCreateItem2(), Spell::EffectCreateRandomItem(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ AutoUnequipOffhandIfNeed()

void Player::AutoUnequipOffhandIfNeed ( bool  force = false)
12514{
12516 if (!offItem)
12517 {
12519 return;
12520 }
12521
12522 // unequip offhand weapon if player doesn't have dual wield anymore
12524 force = true;
12525
12526 // unequip offhand weapon if player main hand weapon is a polearm or staff or fishing pole
12528 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
12529 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||
12530 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF ||
12531 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE)
12532 force = true;
12533
12534 // need unequip offhand for 2h-weapon without TitanGrip (in any from hands)
12535 if (!force && (CanTitanGrip() || (offItem->GetTemplate()->InventoryType != INVTYPE_2HWEAPON && !IsTwoHandUsed())))
12536 {
12538 return;
12539 }
12540
12541 ItemPosCountVec off_dest;
12542 uint8 off_msg = CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false);
12543 if (off_msg == EQUIP_ERR_OK)
12544 {
12546 StoreItem(off_dest, offItem, true);
12547 }
12548 else
12549 {
12551 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
12552 offItem->DeleteFromInventoryDB(trans); // deletes item from character's inventory
12553 offItem->SaveToDB(trans); // recursive and not have transaction guard into self, item not in inventory and can be save standalone
12554
12555 std::string subject = GetSession()->GetAcoreString(LANG_NOT_EQUIPPED_ITEM);
12556 MailDraft(subject, "There were problems with equipping one or several items").AddItem(offItem).SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
12557
12558 CharacterDatabase.CommitTransaction(trans);
12559 }
12561}
@ ITEM_SUBCLASS_WEAPON_STAFF
Definition ItemTemplate.h:354
@ ITEM_SUBCLASS_WEAPON_FISHING_POLE
Definition ItemTemplate.h:364
@ ITEM_SUBCLASS_WEAPON_POLEARM
Definition ItemTemplate.h:350
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition Mail.cpp:185
MailDraft & AddItem(Item *item)
Definition Mail.cpp:93
bool CanTitanGrip() const
Definition Player.h:2187
bool IsTwoHandUsed() const
Definition Player.h:1362
void MoveItemFromInventory(uint8 bag, uint8 slot, bool update)
Definition PlayerStorage.cpp:2979
void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap=false)
Definition PlayerStorage.cpp:2899
void UpdateTitansGrip()
Definition PlayerUpdates.cpp:1830
uint32 InventoryType
Definition ItemTemplate.h:632

References MailDraft::AddItem(), Unit::CanDualWield(), CanStoreItem(), CanTitanGrip(), CharacterDatabase, Item::DeleteFromInventoryDB(), EQUIP_ERR_OK, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, WorldSession::GetAcoreString(), GetItemByPos(), GetSession(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, IsTwoHandUsed(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, LANG_NOT_EQUIPPED_ITEM, MAIL_CHECK_MASK_COPIED, MAIL_STATIONERY_GM, MoveItemFromInventory(), NULL_BAG, NULL_SLOT, RemoveItem(), Item::SaveToDB(), MailDraft::SendMailTo(), StoreItem(), and UpdateTitansGrip().

Referenced by _StoreOrEquipNewItem(), ActivateSpec(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), resetTalents(), SplitItem(), StoreNewItemInBestSlots(), SwapItem(), and UpdateZone().

◆ BankItem()

Item * Player::BankItem ( ItemPosCountVec const &  dest,
Item pItem,
bool  update 
)
inline

◆ BindToInstance()

void Player::BindToInstance ( )
6522{
6523 InstanceSave* mapSave = sInstanceSaveMgr->GetInstanceSave(_pendingBindId);
6524 if (!mapSave) //it seems sometimes mapSave is nullptr, but I did not check why
6525 return;
6526
6528 data << uint32(0);
6529 SendDirectMessage(&data);
6530 sInstanceSaveMgr->PlayerBindToInstance(this->GetGUID(), mapSave, true, this);
6531}
#define sInstanceSaveMgr
Definition InstanceSaveMgr.h:202
Definition InstanceSaveMgr.h:56
uint32 _pendingBindId
Definition Player.h:3003
@ SMSG_INSTANCE_SAVE_CREATED
Definition Opcodes.h:745

References _pendingBindId, Object::GetGUID(), SendDirectMessage(), sInstanceSaveMgr, and SMSG_INSTANCE_SAVE_CREATED.

Referenced by WorldSession::HandleInstanceLockResponse(), and Update().

◆ BuildCreateUpdateBlockForPlayer()

void Player::BuildCreateUpdateBlockForPlayer ( UpdateData data,
Player target 
)
overridevirtual

Reimplemented from Object.

3830{
3831 if (target == this)
3832 {
3833 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
3834 {
3835 if (!m_items[i])
3836 continue;
3837
3838 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3839 }
3840
3842 {
3843 if (!m_items[i])
3844 continue;
3845
3846 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3847 }
3849 {
3850 if (!m_items[i])
3851 continue;
3852
3853 m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
3854 }
3855 }
3856
3858}
@ KEYRING_SLOT_START
Definition Player.h:725
@ BANK_SLOT_BAG_END
Definition Player.h:713
virtual void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:178

References BANK_SLOT_BAG_END, Object::BuildCreateUpdateBlockForPlayer(), CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

Referenced by Map::SendInitSelf().

◆ BuildEnchantmentsInfoData()

void Player::BuildEnchantmentsInfoData ( WorldPacket data)
14552{
14553 uint32 slotUsedMask = 0;
14554 std::size_t slotUsedMaskPos = data->wpos();
14555 *data << uint32(slotUsedMask); // slotUsedMask < 0x80000
14556
14557 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14558 {
14560
14561 if (!item)
14562 continue;
14563
14564 slotUsedMask |= (1 << i);
14565
14566 *data << uint32(item->GetEntry()); // item entry
14567
14568 uint16 enchantmentMask = 0;
14569 std::size_t enchantmentMaskPos = data->wpos();
14570 *data << uint16(enchantmentMask); // enchantmentMask < 0x1000
14571
14572 for (uint32 j = 0; j < MAX_ENCHANTMENT_SLOT; ++j)
14573 {
14574 uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(j));
14575
14576 if (!enchId)
14577 continue;
14578
14579 enchantmentMask |= (1 << j);
14580
14581 *data << uint16(enchId); // enchantmentId?
14582 }
14583
14584 data->put<uint16>(enchantmentMaskPos, enchantmentMask);
14585
14586 *data << int16(item->GetItemRandomPropertyId()); // item random property id
14587 *data << item->GetGuidValue(ITEM_FIELD_CREATOR).WriteAsPacked(); // item creator
14588 *data << uint32(item->GetItemSuffixFactor()); // item suffix factor
14589 }
14590
14591 data->put<uint32>(slotUsedMaskPos, slotUsedMask);
14592}
@ ITEM_FIELD_CREATOR
Definition UpdateFields.h:37
std::size_t wpos() const
Definition ByteBuffer.h:330
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
ObjectGuid GetGuidValue(uint16 index) const
Definition Object.cpp:326

References EQUIPMENT_SLOT_END, Item::GetEnchantmentId(), Object::GetEntry(), Object::GetGuidValue(), GetItemByPos(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), INVENTORY_SLOT_BAG_0, ITEM_FIELD_CREATOR, MAX_ENCHANTMENT_SLOT, ByteBuffer::put(), ByteBuffer::wpos(), and ObjectGuid::WriteAsPacked().

Referenced by WorldSession::HandleInspectOpcode().

◆ BuildEnumData()

bool Player::BuildEnumData ( PreparedQueryResult  result,
WorldPacket data 
)
static
1104{
1105 // 0 1 2 3 4 5 6 7
1106 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle,
1107 // 8 9 10 11 12 13 14 15
1108 // characters.hairColor, characters.facialStyle, character.level, characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z,
1109 // 16 17 18 19 20 21 22 23
1110 // guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, character_banned.guid,
1111 // 24 25
1112 // characters.extra_flags, character_declinedname.genitive
1113
1114 Field* fields = result->Fetch();
1115
1116 ObjectGuid::LowType guidLow = fields[0].Get<uint32>();
1117 uint8 plrRace = fields[2].Get<uint8>();
1118 uint8 plrClass = fields[3].Get<uint8>();
1119 uint8 gender = fields[4].Get<uint8>();
1120
1121 ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(guidLow);
1122
1123 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(plrRace, plrClass);
1124 if (!info)
1125 {
1126 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Don't build enum.", guid.ToString());
1127 return false;
1128 }
1129 else if (!IsValidGender(gender))
1130 {
1131 LOG_ERROR("entities.player", "Player ({}) has incorrect gender ({}), don't build enum.", guid.ToString(), gender);
1132 return false;
1133 }
1134
1135 *data << guid;
1136 *data << fields[1].Get<std::string>(); // name
1137 *data << uint8(plrRace); // race
1138 *data << uint8(plrClass); // class
1139 *data << uint8(gender); // gender
1140
1141 uint8 skin = fields[5].Get<uint8>();
1142 uint8 face = fields[6].Get<uint8>();
1143 uint8 hairStyle = fields[7].Get<uint8>();
1144 uint8 hairColor = fields[8].Get<uint8>();
1145 uint8 facialStyle = fields[9].Get<uint8>();
1146
1147 uint32 charFlags = 0;
1148 uint32 playerFlags = fields[17].Get<uint32>();
1149 uint16 atLoginFlags = fields[18].Get<uint16>();
1150 uint32 zone = (atLoginFlags & AT_LOGIN_FIRST) != 0 ? 0 : fields[11].Get<uint16>(); // if first login do not show the zone
1151
1152 *data << uint8(skin);
1153 *data << uint8(face);
1154 *data << uint8(hairStyle);
1155 *data << uint8(hairColor);
1156 *data << uint8(facialStyle);
1157
1158 *data << uint8(fields[10].Get<uint8>()); // level
1159 *data << uint32(zone); // zone
1160 *data << uint32(fields[12].Get<uint16>()); // map
1161
1162 *data << fields[13].Get<float>(); // x
1163 *data << fields[14].Get<float>(); // y
1164 *data << fields[15].Get<float>(); // z
1165
1166 *data << uint32(fields[16].Get<uint32>()); // guild id
1167
1168 if (playerFlags & PLAYER_FLAGS_RESTING)
1169 playerFlags |= CHARACTER_FLAG_RESTING;
1170 if (atLoginFlags & AT_LOGIN_RESURRECT)
1171 playerFlags &= ~PLAYER_FLAGS_GHOST;
1172 if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
1173 charFlags |= CHARACTER_FLAG_HIDE_HELM;
1174 if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
1175 charFlags |= CHARACTER_FLAG_HIDE_CLOAK;
1176 if (playerFlags & PLAYER_FLAGS_GHOST)
1177 charFlags |= CHARACTER_FLAG_GHOST;
1178 if (atLoginFlags & AT_LOGIN_RENAME)
1179 charFlags |= CHARACTER_FLAG_RENAME;
1180 if (fields[23].Get<uint32>())
1182 if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED))
1183 {
1184 if (!fields[25].Get<std::string>().empty())
1185 charFlags |= CHARACTER_FLAG_DECLINED;
1186 }
1187 else
1188 charFlags |= CHARACTER_FLAG_DECLINED;
1189
1190 *data << uint32(charFlags); // character flags
1191
1192 // character customize flags
1193 if (atLoginFlags & AT_LOGIN_CUSTOMIZE)
1195 else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION)
1197 else if (atLoginFlags & AT_LOGIN_CHANGE_RACE)
1199 else
1201
1202 // First login
1203 *data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);
1204
1205 // Pets info
1206 uint32 petDisplayId = 0;
1207 uint32 petLevel = 0;
1208 uint32 petFamily = 0;
1209
1210 // show pet at selection character in character list only for non-ghost character
1211 if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || (plrClass == CLASS_DEATH_KNIGHT && (fields[21].Get<uint32>()&PLAYER_EXTRA_SHOW_DK_PET))))
1212 {
1213 uint32 entry = fields[19].Get<uint32>();
1214 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry);
1215 if (creatureInfo)
1216 {
1217 petDisplayId = fields[20].Get<uint32>();
1218 petLevel = fields[21].Get<uint16>();
1219 petFamily = creatureInfo->family;
1220 }
1221 }
1222
1223 *data << uint32(petDisplayId);
1224 *data << uint32(petLevel);
1225 *data << uint32(petFamily);
1226
1227 std::vector<std::string_view> equipment = Acore::Tokenize(fields[22].Get<std::string_view>(), ' ', false);
1228 for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
1229 {
1230 uint32 const visualBase = slot * 2;
1231 Optional<uint32> itemId;
1232
1233 if (visualBase < equipment.size())
1234 {
1235 itemId = Acore::StringTo<uint32>(equipment[visualBase]);
1236 }
1237
1238 ItemTemplate const* proto = nullptr;
1239 if (itemId)
1240 {
1241 proto = sObjectMgr->GetItemTemplate(*itemId);
1242 }
1243
1244 if (!proto)
1245 {
1246 if (!itemId || *itemId)
1247 {
1248 LOG_WARN("entities.player.loading", "Player {} has invalid equipment '{}' in `equipmentcache` at index {}. Skipped.",
1249 guid.ToString(), (visualBase < equipment.size()) ? equipment[visualBase] : "<none>", visualBase);
1250 }
1251
1252 *data << uint32(0);
1253 *data << uint8(0);
1254 *data << uint32(0);
1255
1256 continue;
1257 }
1258
1259 SpellItemEnchantmentEntry const* enchant = nullptr;
1260
1261 Optional<uint32> enchants = {};
1262 if ((visualBase + 1) < equipment.size())
1263 {
1264 enchants = Acore::StringTo<uint32>(equipment[visualBase + 1]);
1265 }
1266
1267 if (!enchants)
1268 {
1269 LOG_WARN("entities.player.loading", "Player {} has invalid enchantment info '{}' in `equipmentcache` at index {}. Skipped.",
1270 guid.ToString(), ((visualBase + 1) < equipment.size()) ? equipment[visualBase + 1] : "<none>", visualBase + 1);
1271
1272 enchants = 0;
1273 }
1274
1275 for (uint8 enchantSlot = PERM_ENCHANTMENT_SLOT; enchantSlot <= TEMP_ENCHANTMENT_SLOT; ++enchantSlot)
1276 {
1277 // values stored in 2 uint16
1278 uint32 enchantId = 0x0000FFFF & ((*enchants) >> enchantSlot * 16);
1279 if (!enchantId)
1280 {
1281 continue;
1282 }
1283
1284 enchant = sSpellItemEnchantmentStore.LookupEntry(enchantId);
1285 if (enchant)
1286 {
1287 break;
1288 }
1289 }
1290
1291 *data << uint32(proto->DisplayInfoID);
1292 *data << uint8(proto->InventoryType);
1293 *data << uint32(enchant ? enchant->aura_id : 0);
1294 }
1295
1296 return true;
1297}
@ CHAR_CUSTOMIZE_FLAG_RACE
Definition Player.cpp:144
@ CHAR_CUSTOMIZE_FLAG_NONE
Definition Player.cpp:141
@ CHAR_CUSTOMIZE_FLAG_FACTION
Definition Player.cpp:143
@ CHAR_CUSTOMIZE_FLAG_CUSTOMIZE
Definition Player.cpp:142
@ CHARACTER_FLAG_RESTING
Definition Player.cpp:106
@ CHARACTER_FLAG_GHOST
Definition Player.cpp:118
@ CHARACTER_FLAG_DECLINED
Definition Player.cpp:130
@ CHARACTER_FLAG_HIDE_HELM
Definition Player.cpp:115
@ CHARACTER_FLAG_HIDE_CLOAK
Definition Player.cpp:116
@ CHARACTER_FLAG_LOCKED_BY_BILLING
Definition Player.cpp:129
@ CHARACTER_FLAG_RENAME
Definition Player.cpp:119
@ PLAYER_EXTRA_SHOW_DK_PET
Definition Player.h:587
@ PLAYER_FLAGS_HIDE_CLOAK
Definition Player.h:479
@ PLAYER_FLAGS_GHOST
Definition Player.h:472
@ PLAYER_FLAGS_HIDE_HELM
Definition Player.h:478
@ AT_LOGIN_FIRST
Definition Player.h:600
@ AT_LOGIN_RESURRECT
Definition Player.h:606
@ AT_LOGIN_CUSTOMIZE
Definition Player.h:598
@ AT_LOGIN_RENAME
Definition Player.h:595
@ AT_LOGIN_CHANGE_RACE
Definition Player.h:602
@ AT_LOGIN_CHANGE_FACTION
Definition Player.h:601
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CONFIG_DECLINED_NAMES_USED
Definition WorldConfig.h:67
static bool IsValidGender(uint8 Gender)
Definition Player.h:1569
Definition CreatureData.h:186
uint32 DisplayInfoID
Definition ItemTemplate.h:625
uint32 aura_id
Definition DBCStructure.h:1851

References AT_LOGIN_CHANGE_FACTION, AT_LOGIN_CHANGE_RACE, AT_LOGIN_CUSTOMIZE, AT_LOGIN_FIRST, AT_LOGIN_RENAME, AT_LOGIN_RESURRECT, SpellItemEnchantmentEntry::aura_id, CHAR_CUSTOMIZE_FLAG_CUSTOMIZE, CHAR_CUSTOMIZE_FLAG_FACTION, CHAR_CUSTOMIZE_FLAG_NONE, CHAR_CUSTOMIZE_FLAG_RACE, CHARACTER_FLAG_DECLINED, CHARACTER_FLAG_GHOST, CHARACTER_FLAG_HIDE_CLOAK, CHARACTER_FLAG_HIDE_HELM, CHARACTER_FLAG_LOCKED_BY_BILLING, CHARACTER_FLAG_RENAME, CHARACTER_FLAG_RESTING, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_WARLOCK, CONFIG_DECLINED_NAMES_USED, ItemTemplate::DisplayInfoID, Field::Get(), INVENTORY_SLOT_BAG_END, ItemTemplate::InventoryType, IsValidGender(), LOG_ERROR, LOG_WARN, PERM_ENCHANTMENT_SLOT, PLAYER_EXTRA_SHOW_DK_PET, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, PLAYER_FLAGS_RESTING, sObjectMgr, sSpellItemEnchantmentStore, sWorld, TEMP_ENCHANTMENT_SLOT, and Acore::Tokenize().

Referenced by WorldSession::HandleCharEnum().

◆ BuildPetTalentsInfoData()

void Player::BuildPetTalentsInfoData ( WorldPacket data)
14469{
14470 uint32 unspentTalentPoints = 0;
14471 std::size_t pointsPos = data->wpos();
14472 *data << uint32(unspentTalentPoints); // [PH], unspentTalentPoints
14473
14474 uint8 talentIdCount = 0;
14475 std::size_t countPos = data->wpos();
14476 *data << uint8(talentIdCount); // [PH], talentIdCount
14477
14478 Pet* pet = GetPet();
14479 if (!pet)
14480 return;
14481
14482 unspentTalentPoints = pet->GetFreeTalentPoints();
14483
14484 data->put<uint32>(pointsPos, unspentTalentPoints); // put real points
14485
14486 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14487 if (!ci)
14488 return;
14489
14490 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14491 if (!pet_family || pet_family->petTalentType < 0)
14492 return;
14493
14494 for (uint32 talentTabId = 1; talentTabId < sTalentTabStore.GetNumRows(); ++talentTabId)
14495 {
14496 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentTabId);
14497 if (!talentTabInfo)
14498 continue;
14499
14500 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14501 continue;
14502
14503 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
14504 {
14505 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14506 if (!talentInfo)
14507 continue;
14508
14509 // skip another tab talents
14510 if (talentInfo->TalentTab != talentTabId)
14511 continue;
14512
14513 // find max talent rank (0~4)
14514 int8 curtalent_maxrank = -1;
14515 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14516 {
14517 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14518 {
14519 curtalent_maxrank = rank;
14520 break;
14521 }
14522 }
14523
14524 // not learned talent
14525 if (curtalent_maxrank < 0)
14526 continue;
14527
14528 *data << uint32(talentInfo->TalentID); // Talent.dbc
14529 *data << uint8(curtalent_maxrank); // talentMaxRank (0-4)
14530
14531 ++talentIdCount;
14532 }
14533
14534 data->put<uint8>(countPos, talentIdCount); // put real count
14535
14536 break;
14537 }
14538}
DBCStorage< TalentTabEntry > sTalentTabStore(TalentTabEntryfmt)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
#define MAX_TALENT_RANK
Definition DBCStructure.h:1919
std::int8_t int8
Definition Define.h:105
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:208
uint8 GetFreeTalentPoints()
Definition Pet.h:131
bool HasSpell(uint32 spell) const override
Definition Pet.cpp:2343
Definition DBCStructure.h:754
int32 petTalentType
Definition DBCStructure.h:762
uint32 TalentTab
Definition DBCStructure.h:1926
Definition DBCStructure.h:1941
uint32 petTalentMask
Definition DBCStructure.h:1948

References Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), GetPet(), Pet::HasSpell(), MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, ByteBuffer::put(), TalentEntry::RankID, sCreatureFamilyStore, sTalentStore, sTalentTabStore, TalentEntry::TalentID, TalentEntry::TalentTab, and ByteBuffer::wpos().

Referenced by SendTalentsInfoData().

◆ BuildPlayerRepop()

void Player::BuildPlayerRepop ( )
4439{
4441 data << GetPackGUID();
4442 SendDirectMessage(&data);
4443 if (getRace(true) == RACE_NIGHTELF)
4444 {
4445 CastSpell(this, 20584, true);
4446 }
4447 CastSpell(this, 8326, true);
4448
4449 // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
4450 // there must be SMSG.STOP_MIRROR_TIMER
4451
4452 // the player cannot have a corpse already on current map, only bones which are not returned by GetCorpse
4453 WorldLocation corpseLocation = GetCorpseLocation();
4454 if (GetCorpse() && corpseLocation.GetMapId() == GetMapId())
4455 {
4456 LOG_ERROR("entities.player", "BuildPlayerRepop: player {} ({}) already has a corpse", GetName(), GetGUID().ToString());
4457 return;
4458 }
4459
4460 // create a corpse and place it at the player's location
4461 Corpse* corpse = CreateCorpse();
4462 if (!corpse)
4463 {
4464 LOG_ERROR("entities.player", "Error creating corpse for Player {} [{}]", GetName(), GetGUID().ToString());
4465 return;
4466 }
4467 GetMap()->AddToMap(corpse);
4468 SetHealth(1); // convert player body to ghost
4470 SetWaterWalking(true);
4471
4472 if (!IsImmobilizedState())
4473 SendMoveRoot(false);
4474
4475 RemoveUnitFlag(UNIT_FLAG_SKINNABLE); // BG - remove insignia related
4476 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4477 if (corpseReclaimDelay >= 0)
4478 {
4479 SendCorpseReclaimDelay(corpseReclaimDelay);
4480 }
4481 corpse->ResetGhostTime(); // to prevent cheating
4482 StopMirrorTimers(); // disable timers on bars
4484 sScriptMgr->OnPlayerReleasedGhost(this);
4485}
@ MOVE_WATER_WALK
Definition Player.h:452
@ RACE_NIGHTELF
Definition SharedDefines.h:74
@ UNIT_BYTE1_FLAG_ALWAYS_STAND
Definition UnitDefines.h:59
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition UnitDefines.h:26
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:280
@ UNIT_FIELD_BYTES_1
Definition UpdateFields.h:131
Definition Corpse.h:49
void ResetGhostTime()
Definition Corpse.cpp:195
bool AddToMap(T *, bool checkTransport=false)
Definition Map.cpp:305
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:739
PackedGuid const & GetPackGUID() const
Definition Object.h:115
void SendCorpseReclaimDelay(uint32 delay)
Definition Player.cpp:13024
void StopMirrorTimers()
Definition Player.h:2054
WorldLocation GetCorpseLocation() const
Definition Player.h:2038
Corpse * GetCorpse() const
Definition Player.cpp:4726
int32 CalculateCorpseReclaimDelay(bool load=false)
Definition Player.cpp:12983
Corpse * CreateCorpse()
Definition Player.cpp:4611
void SetMovement(PlayerMovementType pType)
Definition Player.cpp:4412
bool IsImmobilizedState() const
Definition Unit.h:770
void SendMoveRoot(bool state)
Definition Unit.cpp:18264
void SetHealth(uint32 val)
Definition Unit.cpp:15507
void SetWaterWalking(bool enable)
Definition Unit.cpp:20521
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:734
Map * GetMap() const
Definition Object.h:621
@ SMSG_PRE_RESURRECT
Definition Opcodes.h:1202

References Map::AddToMap(), CalculateCorpseReclaimDelay(), Unit::CastSpell(), CreateCorpse(), GetCorpse(), GetCorpseLocation(), Object::GetGUID(), WorldObject::GetMap(), WorldLocation::GetMapId(), WorldObject::GetName(), Object::GetPackGUID(), Unit::getRace(), Unit::IsImmobilizedState(), LOG_ERROR, MOVE_WATER_WALK, RACE_NIGHTELF, Unit::RemoveUnitFlag(), Corpse::ResetGhostTime(), SendCorpseReclaimDelay(), SendDirectMessage(), Unit::SendMoveRoot(), Object::SetByteValue(), Unit::SetHealth(), SetMovement(), Unit::SetWaterWalking(), SMSG_PRE_RESURRECT, sScriptMgr, StopMirrorTimers(), Position::ToString(), UNIT_BYTE1_FLAG_ALWAYS_STAND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, and UNIT_FLAG_SKINNABLE.

Referenced by Spell::EffectStuck(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), RemovedInsignia(), and Update().

◆ BuildPlayerTalentsInfoData()

void Player::BuildPlayerTalentsInfoData ( WorldPacket data)
14435{
14436 *data << uint32(GetFreeTalentPoints()); // unspentTalentPoints
14437 *data << uint8(m_specsCount); // talent group count (0, 1 or 2)
14438 *data << uint8(m_activeSpec); // talent group index (0 or 1)
14439
14442
14443 for (uint32 specIdx = 0; specIdx < m_specsCount; ++specIdx)
14444 {
14445 uint8 talentIdCount = 0;
14446 std::size_t pos = data->wpos();
14447 *data << uint8(talentIdCount); // [PH], talentIdCount
14448
14449 const PlayerTalentMap& talentMap = GetTalentMap();
14450 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14451 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14452 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(specIdx)) // pussywizard
14453 {
14454 *data << uint32(talentPos->talent_id); // Talent.dbc
14455 *data << uint8(talentPos->rank); // talentMaxRank (0-4)
14456 ++talentIdCount;
14457 }
14458
14459 data->put<uint8>(pos, talentIdCount); // put real count
14460
14461 *data << uint8(MAX_GLYPH_SLOT_INDEX); // glyphs count
14462
14463 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
14464 *data << uint16(m_Glyphs[specIdx][i]); // GlyphProperties.dbc
14465 }
14466}
std::unordered_map< uint32, PlayerTalent * > PlayerTalentMap
Definition Player.h:194
uint32 GetFreeTalentPoints() const
Definition Player.h:1709
const PlayerTalentMap & GetTalentMap() const
Definition Player.h:2610

References GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), m_activeSpec, m_Glyphs, m_specsCount, MAX_GLYPH_SLOT_INDEX, MAX_TALENT_SPECS, PLAYERSPELL_REMOVED, ByteBuffer::put(), and ByteBuffer::wpos().

Referenced by WorldSession::HandleInspectOpcode(), and SendTalentsInfoData().

◆ BuyItemFromVendorSlot()

bool Player::BuyItemFromVendorSlot ( ObjectGuid  vendorguid,
uint32  vendorslot,
uint32  item,
uint8  count,
uint8  bag,
uint8  slot 
)
10731{
10732 sScriptMgr->OnPlayerBeforeBuyItemFromVendor(this, vendorguid, vendorslot, item, count, bag, slot);
10733
10734 // this check can be used from the hook to implement a custom vendor process
10735 if (item == 0)
10736 return true;
10737
10738 // cheating attempt
10739 if (count < 1) count = 1;
10740
10741 // cheating attempt
10742 if (slot > MAX_BAG_SIZE && slot != NULL_SLOT)
10743 return false;
10744
10745 if (!IsAlive())
10746 return false;
10747
10748 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
10749 if (!pProto)
10750 {
10751 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10752 return false;
10753 }
10754
10755 if (!(pProto->AllowableClass & getClassMask()) && pProto->Bonding == BIND_WHEN_PICKED_UP && !IsGameMaster())
10756 {
10757 SendBuyError(BUY_ERR_CANT_FIND_ITEM, nullptr, item, 0);
10758 return false;
10759 }
10760
10762 {
10763 return false;
10764 }
10765
10766 Creature* creature = GetNPCIfCanInteractWith(vendorguid, UNIT_NPC_FLAG_VENDOR);
10767 if (!creature)
10768 {
10769 LOG_DEBUG("network", "WORLD: BuyItemFromVendor - Unit ({}) not found or you can't interact with him.", vendorguid.ToString());
10770 SendBuyError(BUY_ERR_DISTANCE_TOO_FAR, nullptr, item, 0);
10771 return false;
10772 }
10773
10774 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), item);
10775 if (!sConditionMgr->IsObjectMeetToConditions(this, creature, conditions))
10776 {
10777 //LOG_DEBUG("condition", "BuyItemFromVendor: conditions not met for creature entry {} item {}", creature->GetEntry(), item);
10778 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10779 return false;
10780 }
10781
10782 VendorItemData const* vItems = GetSession()->GetCurrentVendor() ? sObjectMgr->GetNpcVendorItemList(GetSession()->GetCurrentVendor()) : creature->GetVendorItems();
10783 if (!vItems || vItems->Empty())
10784 {
10785 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10786 return false;
10787 }
10788
10789 if (vendorslot >= vItems->GetItemCount())
10790 {
10791 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10792 return false;
10793 }
10794
10795 VendorItem const* crItem = vItems->GetItem(vendorslot);
10796 // store diff item (cheating)
10797 if (!crItem || crItem->item != item)
10798 {
10799 SendBuyError(BUY_ERR_CANT_FIND_ITEM, creature, item, 0);
10800 return false;
10801 }
10802
10803 // check current item amount if it limited
10804 if (crItem->maxcount != 0)
10805 {
10806 if (creature->GetVendorItemCurrentCount(crItem) < pProto->BuyCount * count)
10807 {
10808 SendBuyError(BUY_ERR_ITEM_ALREADY_SOLD, creature, item, 0);
10809 return false;
10810 }
10811 }
10812
10814 {
10815 SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
10816 return false;
10817 }
10818
10819 if (crItem->ExtendedCost)
10820 {
10821 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(crItem->ExtendedCost);
10822 if (!iece)
10823 {
10824 LOG_ERROR("entities.player", "Item {} have wrong ExtendedCost field value {}", pProto->ItemId, crItem->ExtendedCost);
10825 return false;
10826 }
10827
10828 // honor points price
10829 if (GetHonorPoints() < (iece->reqhonorpoints * count))
10830 {
10832 return false;
10833 }
10834
10835 // arena points price
10836 if (GetArenaPoints() < (iece->reqarenapoints * count))
10837 {
10839 return false;
10840 }
10841
10842 // item base price
10843 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
10844 {
10845 if (iece->reqitem[i] && !HasItemCount(iece->reqitem[i], (iece->reqitemcount[i] * count)))
10846 {
10848 return false;
10849 }
10850 }
10851
10852 // check for personal arena rating requirement
10854 {
10855 // probably not the proper equip err
10856 SendEquipError(EQUIP_ERR_CANT_EQUIP_RANK, nullptr, nullptr);
10857 return false;
10858 }
10859 }
10860
10861 uint32 price = 0;
10862 if (crItem->IsGoldRequired(pProto) && pProto->BuyPrice > 0) //Assume price cannot be negative (do not know why it is int32)
10863 {
10864 uint32 maxCount = MAX_MONEY_AMOUNT / pProto->BuyPrice;
10865 if ((uint32)count > maxCount)
10866 {
10867 LOG_ERROR("entities.player", "Player {} tried to buy {} item id {}, causing overflow", GetName(), (uint32)count, pProto->ItemId);
10868 count = (uint8)maxCount;
10869 }
10870 price = pProto->BuyPrice * count; //it should not exceed MAX_MONEY_AMOUNT
10871
10872 // reputation discount
10873 price = uint32(std::floor(price * GetReputationPriceDiscount(creature)));
10874
10875 if (!HasEnoughMoney(price))
10876 {
10877 SendBuyError(BUY_ERR_NOT_ENOUGHT_MONEY, creature, item, 0);
10878 return false;
10879 }
10880 }
10881
10882 if ((bag == NULL_BAG && slot == NULL_SLOT) || IsInventoryPos(bag, slot))
10883 {
10884 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, true))
10885 return false;
10886 }
10887 else if (IsEquipmentPos(bag, slot))
10888 {
10889 if (pProto->BuyCount * count != 1)
10890 {
10892 return false;
10893 }
10894 if (!_StoreOrEquipNewItem(vendorslot, item, count, bag, slot, price, pProto, creature, crItem, false))
10895 return false;
10896 }
10897 else
10898 {
10900 return false;
10901 }
10902
10903 return crItem->maxcount != 0;
10904}
#define MAX_BAG_SIZE
Definition Bag.h:22
std::list< Condition * > ConditionList
Definition ConditionMgr.h:238
@ ITEM_FLAG2_FACTION_HORDE
Definition ItemTemplate.h:183
@ ITEM_FLAG2_FACTION_ALLIANCE
Definition ItemTemplate.h:184
@ EQUIP_ERR_CANT_EQUIP_RANK
Definition Item.h:110
@ EQUIP_ERR_ITEM_CANT_BE_EQUIPPED
Definition Item.h:67
@ EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS
Definition Item.h:116
@ EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT
Definition Item.h:50
@ EQUIP_ERR_VENDOR_MISSING_TURNINS
Definition Item.h:115
@ EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS
Definition Item.h:117
@ BUY_ERR_CANT_FIND_ITEM
Definition Item.h:141
@ BUY_ERR_DISTANCE_TOO_FAR
Definition Item.h:145
@ BUY_ERR_NOT_ENOUGHT_MONEY
Definition Item.h:143
@ BUY_ERR_REPUTATION_REQUIRE
Definition Item.h:149
@ BUY_ERR_ITEM_ALREADY_SOLD
Definition Item.h:142
#define MAX_MONEY_AMOUNT
Definition Player.h:925
@ TEAM_ALLIANCE
Definition SharedDefines.h:771
@ TEAM_HORDE
Definition SharedDefines.h:772
@ UNIT_NPC_FLAG_VENDOR
Definition UnitDefines.h:326
VendorItemData const * GetVendorItems() const
Definition Creature.cpp:3073
uint32 GetVendorItemCurrentCount(VendorItem const *vItem)
Definition Creature.cpp:3078
bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const *pProto, Creature *pVendor, VendorItem const *crItem, bool bStore)
Definition Player.cpp:10664
Creature * GetNPCIfCanInteractWith(ObjectGuid const &guid, uint32 npcflagmask)
Definition Player.cpp:2074
bool HasItemCount(uint32 item, uint32 count=1, bool inBankAlso=false) const
Definition PlayerStorage.cpp:656
bool HasEnoughMoney(uint32 amount) const
Definition Player.h:1605
bool IsGameMaster() const
Definition Player.h:1161
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5881
void SendBuyError(BuyResult msg, Creature *creature, uint32 item, uint32 param)
Definition PlayerStorage.cpp:4063
uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const
If trans is specified, arena point save query will be added to trans.
Definition Player.cpp:10906
uint32 GetCurrentVendor() const
Definition WorldSession.h:428
uint32 reqarenaslot
Definition DBCStructure.h:1190
uint32 reqpersonalarenarating
Definition DBCStructure.h:1193
uint32 BuyCount
Definition ItemTemplate.h:629
uint32 AllowableClass
Definition ItemTemplate.h:633
int32 BuyPrice
Definition ItemTemplate.h:630
bool HasFlag2(ItemFlags2 flag) const
Definition ItemTemplate.h:826
uint32 RequiredReputationRank
Definition ItemTemplate.h:643
uint32 RequiredReputationFaction
Definition ItemTemplate.h:642
uint32 ItemId
Definition ItemTemplate.h:620
Definition CreatureData.h:469
VendorItem * GetItem(uint32 slot) const
Definition CreatureData.h:472
bool Empty() const
Definition CreatureData.h:479
uint8 GetItemCount() const
Definition CreatureData.h:480
Definition CreatureData.h:454
uint32 ExtendedCost
Definition CreatureData.h:461
bool IsGoldRequired(ItemTemplate const *pProto) const
Definition CreatureData.h:464
uint32 item
Definition CreatureData.h:458
uint32 maxcount
Definition CreatureData.h:459

References _StoreOrEquipNewItem(), ItemTemplate::AllowableClass, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, BUY_ERR_CANT_FIND_ITEM, BUY_ERR_DISTANCE_TOO_FAR, BUY_ERR_ITEM_ALREADY_SOLD, BUY_ERR_NOT_ENOUGHT_MONEY, BUY_ERR_REPUTATION_REQUIRE, ItemTemplate::BuyCount, ItemTemplate::BuyPrice, VendorItemData::Empty(), EQUIP_ERR_CANT_EQUIP_RANK, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_NOT_ENOUGH_ARENA_POINTS, EQUIP_ERR_NOT_ENOUGH_HONOR_POINTS, EQUIP_ERR_VENDOR_MISSING_TURNINS, VendorItem::ExtendedCost, GetArenaPoints(), Unit::getClassMask(), WorldSession::GetCurrentVendor(), Object::GetEntry(), GetHonorPoints(), VendorItemData::GetItem(), VendorItemData::GetItemCount(), GetMaxPersonalArenaRatingRequirement(), WorldObject::GetName(), GetNPCIfCanInteractWith(), GetReputationPriceDiscount(), GetReputationRank(), GetSession(), GetTeamId(), Creature::GetVendorItemCurrentCount(), Creature::GetVendorItems(), HasEnoughMoney(), ItemTemplate::HasFlag2(), HasItemCount(), Unit::IsAlive(), IsEquipmentPos(), IsGameMaster(), VendorItem::IsGoldRequired(), IsInventoryPos(), VendorItem::item, ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, MAX_BAG_SIZE, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, MAX_MONEY_AMOUNT, VendorItem::maxcount, NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqarenaslot, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, ItemExtendedCostEntry::reqpersonalarenarating, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, sConditionMgr, SendBuyError(), SendEquipError(), sItemExtendedCostStore, sObjectMgr, sScriptMgr, TEAM_ALLIANCE, TEAM_HORDE, ObjectGuid::ToString(), and UNIT_NPC_FLAG_VENDOR.

Referenced by WorldSession::HandleBuyItemInSlotOpcode(), and WorldSession::HandleBuyItemOpcode().

◆ CalculateCorpseReclaimDelay()

int32 Player::CalculateCorpseReclaimDelay ( bool  load = false)
12984{
12985 Corpse* corpse = GetCorpse();
12986
12987 if (load && !corpse)
12988 return -1;
12989
12990 bool pvp = corpse ? corpse->GetType() == CORPSE_RESURRECTABLE_PVP : m_ExtraFlags & PLAYER_EXTRA_PVP_DEATH;
12991
12992 uint32 delay;
12993
12994 if (load)
12995 {
12996 if (corpse->GetGhostTime() > m_deathExpireTime)
12997 return -1;
12998
12999 uint64 count = 0;
13000
13001 if ((pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP)) ||
13002 (!pvp && sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
13003 {
13004 count = (m_deathExpireTime - corpse->GetGhostTime()) / DEATH_EXPIRE_STEP;
13005
13006 if (count >= MAX_DEATH_COUNT)
13007 count = MAX_DEATH_COUNT - 1;
13008 }
13009
13010 time_t expected_time = corpse->GetGhostTime() + copseReclaimDelay[count];
13011 time_t now = GameTime::GetGameTime().count();
13012
13013 if (now >= expected_time)
13014 return -1;
13015
13016 delay = expected_time - now;
13017 }
13018 else
13019 delay = GetCorpseReclaimDelay(pvp);
13020
13021 return delay * IN_MILLISECONDS;
13022}
@ CORPSE_RESURRECTABLE_PVP
Definition Corpse.h:30
static uint32 copseReclaimDelay[MAX_DEATH_COUNT]
Definition Player.cpp:147
@ PLAYER_EXTRA_PVP_DEATH
Definition Player.h:586
#define DEATH_EXPIRE_STEP
Definition Player.h:76
#define MAX_DEATH_COUNT
Definition Player.h:77
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP
Definition WorldConfig.h:62
@ CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE
Definition WorldConfig.h:63
time_t const & GetGhostTime() const
Definition Corpse.h:70
CorpseType GetType() const
Definition Corpse.h:72
uint32 GetCorpseReclaimDelay(bool pvp) const
Definition Player.cpp:12966

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, CORPSE_RESURRECTABLE_PVP, DEATH_EXPIRE_STEP, GetCorpse(), GetCorpseReclaimDelay(), GameTime::GetGameTime(), Corpse::GetGhostTime(), Corpse::GetType(), IN_MILLISECONDS, m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ CalculateMinMaxDamage()

void Player::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex 
)
overridevirtual

Implements Unit.

545{
546 // Only proto damage, not affected by any mods
547 if (damageIndex != 0)
548 {
549 minDamage = 0.0f;
550 maxDamage = 0.0f;
551
552 if (!IsInFeralForm() && CanUseAttackType(attType))
553 {
554 minDamage = GetWeaponDamageRange(attType, MINDAMAGE, damageIndex);
555 maxDamage = GetWeaponDamageRange(attType, MAXDAMAGE, damageIndex);
556 }
557
558 return;
559 }
560
561 UnitMods unitMod;
562
563 switch (attType)
564 {
565 case BASE_ATTACK:
566 default:
567 unitMod = UNIT_MOD_DAMAGE_MAINHAND;
568 break;
569 case OFF_ATTACK:
570 unitMod = UNIT_MOD_DAMAGE_OFFHAND;
571 break;
572 case RANGED_ATTACK:
573 unitMod = UNIT_MOD_DAMAGE_RANGED;
574 break;
575 }
576
577 float attackSpeedMod = GetAPMultiplier(attType, normalized);
578
579 float baseValue = GetModifierValue(unitMod, BASE_VALUE) + GetTotalAttackPowerValue(attType) / 14.0f * attackSpeedMod;
580 float basePct = GetModifierValue(unitMod, BASE_PCT);
581 float totalValue = GetModifierValue(unitMod, TOTAL_VALUE);
582 float totalPct = addTotalPct ? GetModifierValue(unitMod, TOTAL_PCT) : 1.0f;
583
584 float weaponMinDamage = GetWeaponDamageRange(attType, MINDAMAGE);
585 float weaponMaxDamage = GetWeaponDamageRange(attType, MAXDAMAGE);
586
587 if (IsAttackSpeedOverridenShapeShift()) // forms with no override on attack speed use normal weapon damage
588 {
589 uint8 lvl = GetLevel();
590 if (lvl > 60)
591 lvl = 60;
592
593 weaponMinDamage = lvl * 0.85f * attackSpeedMod;
594 weaponMaxDamage = lvl * 1.25f * attackSpeedMod;
595 }
596 else if (!CanUseAttackType(attType)) // check if player not in form but still can't use (disarm case)
597 {
598 // cannot use ranged/off attack, set values to 0
599 if (attType != BASE_ATTACK)
600 {
601 minDamage = 0.0f;
602 maxDamage = 0.0f;
603 return;
604 }
605 weaponMinDamage = BASE_MINDAMAGE;
606 weaponMaxDamage = BASE_MAXDAMAGE;
607 }
608 else if (attType == RANGED_ATTACK) // add ammo DPS to ranged damage
609 {
610 weaponMinDamage += GetAmmoDPS() * attackSpeedMod;
611 weaponMaxDamage += GetAmmoDPS() * attackSpeedMod;
612 }
613
614 minDamage = ((weaponMinDamage + baseValue) * basePct + totalValue) * totalPct;
615 maxDamage = ((weaponMaxDamage + baseValue) * basePct + totalValue) * totalPct;
616
617 // pussywizard: crashfix (casting negative to uint => min > max => assertion in urand)
618 if (minDamage < 0.0f || minDamage > 1000000000.0f)
619 minDamage = 0.0f;
620 if (maxDamage < 0.0f || maxDamage > 1000000000.0f)
621 maxDamage = 0.0f;
622 if (minDamage > maxDamage)
623 minDamage = maxDamage;
624}
@ BASE_PCT
Definition Unit.h:129
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15457
float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const
Definition Unit.cpp:15317
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17244
bool IsAttackSpeedOverridenShapeShift() const
Definition Unit.cpp:19276

References BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, Unit::CanUseAttackType(), GetAmmoDPS(), Unit::GetAPMultiplier(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetTotalAttackPowerValue(), Unit::GetWeaponDamageRange(), Unit::IsAttackSpeedOverridenShapeShift(), Unit::IsInFeralForm(), MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, and UNIT_MOD_DAMAGE_RANGED.

◆ CalculateQuestRewardXP()

uint32 Player::CalculateQuestRewardXP ( Quest const *  quest)
1403{
1404 // apply world quest rate
1405 uint32 xp = uint32(quest->XPValue(GetLevel()) * GetQuestRate(quest->IsDFQuest()));
1406
1407 // handle SPELL_AURA_MOD_XP_QUEST_PCT auras
1409 for (Unit::AuraEffectList::const_iterator i = ModXPPctAuras.begin(); i != ModXPPctAuras.end(); ++i)
1410 AddPct(xp, (*i)->GetAmount());
1411
1412 return xp;
1413}
@ SPELL_AURA_MOD_XP_QUEST_PCT
Definition SpellAuraDefines.h:354
T AddPct(T &base, U pct)
Definition Util.h:67
float GetQuestRate(bool isDFQuest=false)
Definition Player.cpp:16262

References AddPct(), Unit::GetAuraEffectsByType(), Unit::GetLevel(), GetQuestRate(), Quest::IsDFQuest(), SPELL_AURA_MOD_XP_QUEST_PCT, and Quest::XPValue().

Referenced by RewardQuest(), PlayerMenu::SendQuestGiverOfferReward(), and PlayerMenu::SendQuestGiverQuestDetails().

◆ CalculateReputationGain()

float Player::CalculateReputationGain ( ReputationSource  source,
uint32  creatureOrQuestLevel,
float  rep,
int32  faction,
bool  noQuestBonus = false 
)
5889{
5890 float percent = 100.0f;
5891
5892 float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN));
5893
5894 // faction specific auras only seem to apply to kills
5895 if (source == REPUTATION_SOURCE_KILL)
5897
5898 percent += rep > 0.f ? repMod : -repMod;
5899
5900 float rate;
5901 switch (source)
5902 {
5904 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL);
5905 break;
5911 rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST);
5912 break;
5914 default:
5915 rate = 1.0f;
5916 break;
5917 }
5918
5919 if (rate != 1.0f && creatureOrQuestLevel <= Acore::XP::GetGrayLevel(GetLevel()))
5920 percent *= rate;
5921
5922 if (percent <= 0.0f)
5923 return 0;
5924
5925 // Multiply result with the faction specific rate
5926 if (RepRewardRate const* repData = sObjectMgr->GetRepRewardRate(faction))
5927 {
5928 float repRate = 0.0f;
5929 switch (source)
5930 {
5932 repRate = repData->creatureRate;
5933 break;
5935 repRate = repData->questRate;
5936 break;
5938 repRate = repData->questDailyRate;
5939 break;
5941 repRate = repData->questWeeklyRate;
5942 break;
5944 repRate = repData->questMonthlyRate;
5945 break;
5947 repRate = repData->questRepeatableRate;
5948 break;
5950 repRate = repData->spellRate;
5951 break;
5952 }
5953
5954 // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
5955 if (repRate <= 0.0f)
5956 return 0;
5957
5958 percent *= repRate;
5959 }
5960
5961 if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false))
5962 percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS);
5963
5964 return CalculatePct(rep, percent);
5965}
@ REPUTATION_SOURCE_KILL
Definition SharedDefines.h:192
@ REPUTATION_SOURCE_SPELL
Definition SharedDefines.h:198
@ REPUTATION_SOURCE_QUEST
Definition SharedDefines.h:193
@ REPUTATION_SOURCE_MONTHLY_QUEST
Definition SharedDefines.h:196
@ REPUTATION_SOURCE_REPEATABLE_QUEST
Definition SharedDefines.h:197
@ REPUTATION_SOURCE_WEEKLY_QUEST
Definition SharedDefines.h:195
@ REPUTATION_SOURCE_DAILY_QUEST
Definition SharedDefines.h:194
@ SPELL_AURA_MOD_REPUTATION_GAIN
Definition SpellAuraDefines.h:219
@ SPELL_AURA_MOD_FACTION_REPUTATION_GAIN
Definition SpellAuraDefines.h:253
@ RATE_REPUTATION_LOWLEVEL_QUEST
Definition WorldConfig.h:444
@ RATE_REPUTATION_LOWLEVEL_KILL
Definition WorldConfig.h:443
@ RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS
Definition WorldConfig.h:445
bool GetsRecruitAFriendBonus(bool forXP)
Definition Player.cpp:12735
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6113
uint8 GetGrayLevel(uint8 pl_level)
Definition Formulas.h:46
Definition ObjectMgr.h:557

References CalculatePct(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), RATE_REPUTATION_LOWLEVEL_KILL, RATE_REPUTATION_LOWLEVEL_QUEST, RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_KILL, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_SPELL, REPUTATION_SOURCE_WEEKLY_QUEST, sObjectMgr, SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, SPELL_AURA_MOD_REPUTATION_GAIN, and sWorld.

Referenced by Spell::EffectReputation(), RewardReputation(), and RewardReputation().

◆ CalculateTalentsPoints()

uint32 Player::CalculateTalentsPoints ( ) const
13667{
13668 uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
13669
13670 uint32 talentPointsForLevel = 0;
13672 {
13673 talentPointsForLevel = base_talent;
13674 }
13675 else
13676 {
13677 talentPointsForLevel = GetLevel() < 56 ? 0 : GetLevel() - 55;
13678 talentPointsForLevel += m_questRewardTalentCount;
13679
13680 if (talentPointsForLevel > base_talent)
13681 {
13682 talentPointsForLevel = base_talent;
13683 }
13684 }
13685
13686 talentPointsForLevel += m_extraBonusTalentCount;
13687 sScriptMgr->OnPlayerCalculateTalentsPoints(this, talentPointsForLevel);
13688 return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT));
13689}
@ MAP_EBON_HOLD
Definition AreaDefines.h:258
@ CLASS_CONTEXT_TALENT_POINT_CALC
Definition UnitDefines.h:237
@ RATE_TALENT
Definition WorldConfig.h:472

References CLASS_CONTEXT_TALENT_POINT_CALC, CLASS_DEATH_KNIGHT, Unit::GetLevel(), WorldLocation::GetMapId(), IsClass(), m_extraBonusTalentCount, m_questRewardTalentCount, MAP_EBON_HOLD, RATE_TALENT, sScriptMgr, and sWorld.

Referenced by InitTalentForLevel(), and resetTalents().

◆ CanAddQuest()

bool Player::CanAddQuest ( Quest const *  quest,
bool  msg 
)
265{
266 if (!SatisfyQuestLog(msg))
267 return false;
268
269 uint32 srcitem = quest->GetSrcItemId();
270 if (srcitem > 0)
271 {
272 uint32 count = quest->GetSrcItemCount();
273 ItemPosCountVec dest;
274 InventoryResult msg2 = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
275
276 // player already have max number (in most case 1) source item, no additional item needed and quest can be added.
278 return true;
279 else if (msg2 != EQUIP_ERR_OK)
280 {
281 SendEquipError(msg2, nullptr, nullptr, srcitem);
282 PlayDirectSound(QUEST_SOUND_FAILURE, this); // Play failure sound
283 return false;
284 }
285 }
286 return true;
287}
@ EQUIP_ERR_CANT_CARRY_MORE_OF_THIS
Definition Item.h:64
@ QUEST_SOUND_FAILURE
Definition Player.h:241
bool SatisfyQuestLog(bool msg)
Definition PlayerQuest.cpp:984
void PlayDirectSound(uint32 sound_id, Player *target=nullptr)
Definition Object.cpp:2908

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, WorldObject::PlayDirectSound(), QUEST_SOUND_FAILURE, SatisfyQuestLog(), and SendEquipError().

Referenced by Spell::EffectQuestStart(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), and SendPreparedQuest().

◆ CanAlwaysSee()

bool Player::CanAlwaysSee ( WorldObject const *  obj) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11463{
11464 // Always can see self
11465 if (m_mover == obj)
11466 return true;
11467
11469 if (obj->GetGUID() == guid)
11470 return true;
11471
11472 return false;
11473}
@ PLAYER_FARSIGHT
Definition UpdateFields.h:334

References Object::GetGUID(), Object::GetGuidValue(), m_mover, and PLAYER_FARSIGHT.

◆ CanBankItem()

InventoryResult Player::CanBankItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
2039{
2040 if (!pItem)
2042
2043 uint32 count = pItem->GetCount();
2044
2045 LOG_DEBUG("entities.player.items", "STORAGE: CanBankItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, pItem->GetEntry(), pItem->GetCount());
2046 ItemTemplate const* pProto = pItem->GetTemplate();
2047 if (!pProto)
2049
2050 // Xinef: Removed next loot generated check
2051 if (pItem->GetGUID() == GetLootGUID())
2053
2054 if (pItem->IsBindedNotWith(this))
2056
2057 // Currency tokens are not supposed to be swapped out of their hidden bag
2058 uint8 pItemslot = pItem->GetSlot();
2059 if (pItemslot >= CURRENCYTOKEN_SLOT_START && pItemslot < CURRENCYTOKEN_SLOT_END)
2060 {
2061 LOG_ERROR("entities.player", "Possible hacking attempt: Player {} [{}] tried to move token [{}, entry: {}] out of the currency bag!",
2062 GetName(), GetGUID().ToString(), pItem->GetGUID().ToString(), pProto->ItemId);
2064 }
2065
2066 // check count of items (skip for auto move for same player from bank)
2068 if (res != EQUIP_ERR_OK)
2069 return res;
2070
2071 // in specific slot
2072 if (bag != NULL_BAG && slot != NULL_SLOT)
2073 {
2074 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
2075 {
2076 if (!pItem->IsBag())
2078
2081
2082 res = CanUseItem(pItem, not_loading);
2083 if (res != EQUIP_ERR_OK)
2084 return res;
2085 }
2086
2087 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
2088 if (res != EQUIP_ERR_OK)
2089 return res;
2090
2091 if (count == 0)
2092 return EQUIP_ERR_OK;
2093 }
2094
2095 // not specific slot or have space for partly store only in specific slot
2096
2097 // in specific bag
2098 if (bag != NULL_BAG)
2099 {
2100 if (pItem->IsNotEmptyBag())
2102
2103 // search stack in bag for merge to
2104 if (pProto->Stackable != 1)
2105 {
2106 if (bag == INVENTORY_SLOT_BAG_0)
2107 {
2108 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2109 if (res != EQUIP_ERR_OK)
2110 return res;
2111
2112 if (count == 0)
2113 return EQUIP_ERR_OK;
2114 }
2115 else
2116 {
2117 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
2118 if (res != EQUIP_ERR_OK)
2119 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
2120
2121 if (res != EQUIP_ERR_OK)
2122 return res;
2123
2124 if (count == 0)
2125 return EQUIP_ERR_OK;
2126 }
2127 }
2128
2129 // search free slot in bag
2130 if (bag == INVENTORY_SLOT_BAG_0)
2131 {
2132 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2133 if (res != EQUIP_ERR_OK)
2134 return res;
2135
2136 if (count == 0)
2137 return EQUIP_ERR_OK;
2138 }
2139 else
2140 {
2141 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
2142 if (res != EQUIP_ERR_OK)
2143 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
2144
2145 if (res != EQUIP_ERR_OK)
2146 return res;
2147
2148 if (count == 0)
2149 return EQUIP_ERR_OK;
2150 }
2151 }
2152
2153 // not specific bag or have space for partly store only in specific bag
2154
2155 // search stack for merge to
2156 if (pProto->Stackable != 1)
2157 {
2158 // in slots
2159 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
2160 if (res != EQUIP_ERR_OK)
2161 return res;
2162
2163 if (count == 0)
2164 return EQUIP_ERR_OK;
2165
2166 // in special bags
2167 if (pProto->BagFamily)
2168 {
2169 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2170 {
2171 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
2172 if (res != EQUIP_ERR_OK)
2173 continue;
2174
2175 if (count == 0)
2176 return EQUIP_ERR_OK;
2177 }
2178 }
2179
2180 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2181 {
2182 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
2183 if (res != EQUIP_ERR_OK)
2184 continue;
2185
2186 if (count == 0)
2187 return EQUIP_ERR_OK;
2188 }
2189 }
2190
2191 // search free place in special bag
2192 if (pProto->BagFamily)
2193 {
2194 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2195 {
2196 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
2197 if (res != EQUIP_ERR_OK)
2198 continue;
2199
2200 if (count == 0)
2201 return EQUIP_ERR_OK;
2202 }
2203 }
2204
2205 // search free space
2206 res = CanStoreItem_InInventorySlots(BANK_SLOT_ITEM_START, BANK_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
2207 if (res != EQUIP_ERR_OK)
2208 return res;
2209
2210 if (count == 0)
2211 return EQUIP_ERR_OK;
2212
2213 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
2214 {
2215 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
2216 if (res != EQUIP_ERR_OK)
2217 continue;
2218
2219 if (count == 0)
2220 return EQUIP_ERR_OK;
2221 }
2222 return EQUIP_ERR_BANK_FULL;
2223}
@ EQUIP_ERR_ALREADY_LOOTED
Definition Item.h:96
@ EQUIP_ERR_DONT_OWN_THAT_ITEM
Definition Item.h:79
@ EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT
Definition Item.h:81
@ EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG
Definition Item.h:52
@ EQUIP_ERR_BANK_FULL
Definition Item.h:98
@ EQUIP_ERR_ITEM_NOT_FOUND
Definition Item.h:70
@ EQUIP_ERR_ITEMS_CANT_BE_SWAPPED
Definition Item.h:68
@ BANK_SLOT_BAG_START
Definition Player.h:712
@ BANK_SLOT_ITEM_START
Definition Player.h:706
@ BANK_SLOT_ITEM_END
Definition Player.h:707
bool IsBindedNotWith(Player const *player) const
Definition Item.cpp:1132
bool IsBag() const
Definition Item.h:254
bool IsNotEmptyBag() const
Definition Item.cpp:311
uint8 GetBankBagSlotCount() const
Definition Player.h:1271
ObjectGuid GetLootGUID() const
Definition Player.h:1993
InventoryResult CanTakeMoreSimilarItems(Item *pItem) const
Definition Player.h:1278
InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition PlayerStorage.cpp:1051
InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool merge, bool non_specialized, Item *pSrcItem, uint8 skip_bag, uint8 skip_slot) const
Definition PlayerStorage.cpp:981
InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const *pProto, uint32 &count, bool swap, Item *pSrcItem) const
Definition PlayerStorage.cpp:910
InventoryResult CanUseItem(Item *pItem, bool not_loading=true) const
Definition PlayerStorage.cpp:2225
uint32 BagFamily
Definition ItemTemplate.h:679
int32 Stackable
Definition ItemTemplate.h:645

References ItemTemplate::BagFamily, BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CanUseItem(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_BANK_FULL, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_MUST_PURCHASE_THAT_BAG_SLOT, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, GetBankBagSlotCount(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetLootGUID(), WorldObject::GetName(), Item::GetSlot(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, Item::IsBag(), Item::IsBindedNotWith(), Item::IsNotEmptyBag(), ItemTemplate::ItemId, LOG_DEBUG, LOG_ERROR, NULL_BAG, NULL_SLOT, ItemTemplate::Stackable, ObjectGuid::ToString(), and Position::ToString().

Referenced by _LoadInventory(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), SplitItem(), and SwapItem().

◆ CanBlock()

bool Player::CanBlock ( ) const
inline
2185{ return m_canBlock; }

References m_canBlock.

Referenced by UpdateBlockPercentage().

◆ CanCaptureTowerPoint()

bool Player::CanCaptureTowerPoint ( ) const
13289{
13290 return (!HasStealthAura() && // not stealthed
13291 !HasInvisibilityAura() && // not invisible
13292 IsAlive() // live player
13293 );
13294}
bool HasStealthAura() const
Definition Unit.h:1796
bool HasInvisibilityAura() const
Definition Unit.h:1798

References Unit::HasInvisibilityAura(), Unit::HasStealthAura(), and Unit::IsAlive().

◆ CanCompleteQuest()

bool Player::CanCompleteQuest ( uint32  quest_id,
const QuestStatusData q_savedStatus = nullptr 
)
290{
291 if (quest_id)
292 {
293 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
294 if (!qInfo)
295 return false;
296
297 // Xinef: take seasonals into account
298 if (!qInfo->IsRepeatable() && !qInfo->IsSeasonal() && IsQuestRewarded(quest_id))
299 return false; // not allow re-complete quest
300
301 // auto complete quest
302 if ((qInfo->IsAutoComplete() || !qInfo->GetQuestMethod()) && CanTakeQuest(qInfo, false))
303 return true;
304
305 QuestStatusData q_status;
306 if (q_savedStatus)
307 q_status = *q_savedStatus;
308 else
309 {
310 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
311 if (itr == m_QuestStatus.end())
312 return false;
313
314 q_status = itr->second;
315 }
316
317 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
318 {
320 {
321 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
322 {
323 if (qInfo->RequiredItemCount[i] != 0 && q_status.ItemCount[i] < qInfo->RequiredItemCount[i])
324 return false;
325 }
326 }
327
329 {
330 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
331 {
332 if (qInfo->RequiredNpcOrGo[i] == 0)
333 continue;
334
335 if (qInfo->RequiredNpcOrGoCount[i] != 0 && q_status.CreatureOrGOCount[i] < qInfo->RequiredNpcOrGoCount[i])
336 return false;
337 }
338 }
339
341 if (qInfo->GetPlayersSlain() != 0 && q_status.PlayerCount < qInfo->GetPlayersSlain())
342 return false;
343
345 return false;
346
347 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED) && q_status.Timer == 0)
348 return false;
349
350 if (qInfo->GetRewOrReqMoney() < 0)
351 {
352 if (!HasEnoughMoney(-qInfo->GetRewOrReqMoney()))
353 return false;
354 }
355
356 uint32 repFacId = qInfo->GetRepObjectiveFaction();
357 if (repFacId && GetReputationMgr().GetReputation(repFacId) < qInfo->GetRepObjectiveValue())
358 return false;
359
360 return true;
361 }
362 }
363 return false;
364}
@ QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT
Definition QuestDef.h:161
bool CanTakeQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:251
uint32 GetReputation(uint32 factionentry) const
Definition Player.cpp:15456
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.h:1625
bool HasSpecialFlag(uint32 flag) const
Definition QuestDef.h:224
int32 GetRepObjectiveValue() const
Definition QuestDef.h:240
int32 RequiredNpcOrGo[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:304
uint32 GetRepObjectiveFaction() const
Definition QuestDef.h:239
uint32 RequiredNpcOrGoCount[QUEST_OBJECTIVES_COUNT]
Definition QuestDef.h:305
bool IsRepeatable() const
Definition QuestDef.h:283
bool IsAutoComplete() const
Definition QuestDef.cpp:274
uint32 GetPlayersSlain() const
Definition QuestDef.h:254
uint32 RequiredItemCount[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:301
int32 GetRewOrReqMoney(uint8 playerLevel=0) const
Definition QuestDef.cpp:238
bool IsSeasonal() const
Definition QuestDef.h:290
uint32 GetQuestMethod() const
Definition QuestDef.h:229

References CanTakeQuest(), QuestStatusData::CreatureOrGOCount, QuestStatusData::Explored, Quest::GetPlayersSlain(), Quest::GetQuestMethod(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveValue(), GetReputation(), GetReputationMgr(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QuestStatusData::ItemCount, m_QuestStatus, QuestStatusData::PlayerCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_SPECIAL_FLAGS_EXPLORATION_OR_EVENT, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, QuestStatusData::Status, and QuestStatusData::Timer.

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), and TalkedToCreature().

◆ CanCompleteRepeatableQuest()

bool Player::CanCompleteRepeatableQuest ( Quest const *  quest)
367{
368 // Solve problem that player don't have the quest and try complete it.
369 // if repeatable she must be able to complete event if player don't have it.
370 // Seem that all repeatable quest are DELIVER Flag so, no need to add more.
371 if (!CanTakeQuest(quest, false))
372 return false;
373
374 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
375 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
376 if (quest->RequiredItemId[i] && quest->RequiredItemCount[i] && !HasItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i]))
377 return false;
378
379 if (!CanRewardQuest(quest, false))
380 return false;
381
382 return true;
383}
bool CanRewardQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:385

References CanRewardQuest(), CanTakeQuest(), HasItemCount(), Quest::HasSpecialFlag(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, and Quest::RequiredItemId.

Referenced by WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverCompleteQuest(), and SendPreparedQuest().

◆ CanEnterWater()

bool Player::CanEnterWater ( ) const
inlineoverridevirtual

Implements Unit.

2570{ return true; }

◆ CanEquipItem()

InventoryResult Player::CanEquipItem ( uint8  slot,
uint16 dest,
Item pItem,
bool  swap,
bool  not_loading = true 
) const
1807{
1808 dest = 0;
1809 if (pItem)
1810 {
1811 LOG_DEBUG("entities.player.items", "STORAGE: CanEquipItem slot = {}, item = {}, count = {}", slot, pItem->GetEntry(), pItem->GetCount());
1812 ItemTemplate const* pProto = pItem->GetTemplate();
1813 if (pProto)
1814 {
1815 if (!sScriptMgr->OnPlayerCanEquipItem(const_cast<Player*>(this), slot, dest, pItem, swap, not_loading))
1817
1818 // item used
1819 if (pItem->m_lootGenerated)
1821
1822 if (pItem->IsBindedNotWith(this))
1824
1825 // check count of items (skip for auto move for same player from bank)
1827 if (res != EQUIP_ERR_OK)
1828 return res;
1829
1830 // check this only in game
1831 if (not_loading)
1832 {
1833 // May be here should be more stronger checks; STUNNED checked
1834 // ROOT, CONFUSED, DISTRACTED, FLEEING this needs to be checked.
1837
1838 // do not allow equipping gear except weapons, offhands, projectiles, relics in
1839 // - combat
1840 // - in-progress arenas
1841 if (!pProto->CanChangeEquipStateInCombat())
1842 {
1843 if (IsInCombat())
1845
1846 if (Battleground* bg = GetBattleground())
1847 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
1849 }
1850
1851 if (IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC))
1852 {
1853 uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
1854 uint32 startRecoveryTime = sSpellMgr->GetSpellInfo(cooldownSpell)->StartRecoveryTime;
1855 if (m_weaponChangeTimer != 0 && m_weaponChangeTimer != startRecoveryTime)
1856 return EQUIP_ERR_CANT_DO_RIGHT_NOW; // maybe exist better err
1857 }
1858
1859 if (IsNonMeleeSpellCast(false))
1861 }
1862
1864 // check allowed level (extend range to upper values if MaxLevel more or equal max player level, this let GM set high level with 1...max range items)
1865 if (ssd && ssd->MaxLevel < DEFAULT_MAX_LEVEL && ssd->MaxLevel < GetLevel())
1867
1868 uint8 eslot = FindEquipSlot(pProto, slot, swap);
1869 if (eslot == NULL_SLOT)
1871
1872 // Xinef: dont allow to equip items on disarmed slot
1873 if (!CanUseAttackType(GetAttackBySlot(eslot)))
1875
1876 res = CanUseItem(pItem, not_loading);
1877 if (res != EQUIP_ERR_OK)
1878 return res;
1879
1880 if (!swap && GetItemByPos(INVENTORY_SLOT_BAG_0, eslot))
1882
1883 // if we are swapping 2 equipped items, CanEquipUniqueItem check
1884 // should ignore the item we are trying to swap, and not the
1885 // destination item. CanEquipUniqueItem should ignore destination
1886 // item only when we are swapping weapon from bag
1887 uint8 ignore = uint8(NULL_SLOT);
1888 switch (eslot)
1889 {
1891 ignore = EQUIPMENT_SLOT_OFFHAND;
1892 break;
1894 ignore = EQUIPMENT_SLOT_MAINHAND;
1895 break;
1897 ignore = EQUIPMENT_SLOT_FINGER2;
1898 break;
1900 ignore = EQUIPMENT_SLOT_FINGER1;
1901 break;
1903 ignore = EQUIPMENT_SLOT_TRINKET2;
1904 break;
1906 ignore = EQUIPMENT_SLOT_TRINKET1;
1907 break;
1908 }
1909
1910 if (ignore == uint8(NULL_SLOT) || pItem != GetItemByPos(INVENTORY_SLOT_BAG_0, ignore))
1911 ignore = eslot;
1912
1913 InventoryResult res2 = CanEquipUniqueItem(pItem, swap ? ignore : uint8(NULL_SLOT));
1914 if (res2 != EQUIP_ERR_OK)
1915 return res2;
1916
1917 // check unique-equipped special item classes
1918 if (pProto->Class == ITEM_CLASS_QUIVER)
1920 if (Item* pBag = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
1921 if (pBag != pItem)
1922 if (ItemTemplate const* pBagProto = pBag->GetTemplate())
1923 if (pBagProto->Class == pProto->Class && (!swap || pBag->GetSlot() != eslot))
1924 return (pBagProto->SubClass == ITEM_SUBCLASS_AMMO_POUCH)
1927
1928 uint32 type = pProto->InventoryType;
1929
1930 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1931 {
1932 // Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1933 // xinef: same for fishing poles
1936
1937 else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1938 {
1939 if (!CanDualWield())
1941 }
1942 else if (type == INVTYPE_2HWEAPON)
1943 {
1944 if (!CanDualWield() || !CanTitanGrip())
1946 }
1947
1948 // Do not allow offhand with main hand polearm, staff or fishing pole
1950 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
1951 if (mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM ||
1952 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF ||
1953 mhWeaponProto->SubClass == ITEM_SUBCLASS_WEAPON_FISHING_POLE)
1955
1956 if (IsTwoHandUsed())
1958 }
1959
1960 // equip two-hand weapon case (with possible unequip 2 items)
1961 if (type == INVTYPE_2HWEAPON)
1962 {
1963 if (eslot == EQUIPMENT_SLOT_OFFHAND)
1964 {
1965 if (!CanTitanGrip())
1967 }
1968 else if (eslot != EQUIPMENT_SLOT_MAINHAND)
1970
1972 {
1973 // offhand item must can be stored in inventory for offhand item and it also must be unequipped
1975 ItemPosCountVec off_dest;
1976 if (offItem && (!not_loading ||
1978 CanStoreItem(NULL_BAG, NULL_SLOT, off_dest, offItem, false) != EQUIP_ERR_OK))
1980 }
1981 }
1982 dest = ((INVENTORY_SLOT_BAG_0 << 8) | eslot);
1983 return EQUIP_ERR_OK;
1984 }
1985 }
1986
1988}
@ STATUS_IN_PROGRESS
Definition Battleground.h:193
#define DEFAULT_MAX_LEVEL
Definition DBCEnums.h:35
@ INVTYPE_RELIC
Definition ItemTemplate.h:284
@ ITEM_SUBCLASS_AMMO_POUCH
Definition ItemTemplate.h:481
@ ITEM_CLASS_QUIVER
Definition ItemTemplate.h:302
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH
Definition Item.h:89
@ EQUIP_ERR_CANT_DUAL_WIELD
Definition Item.h:61
@ EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE
Definition Item.h:56
@ EQUIP_ERR_NOT_DURING_ARENA_MATCH
Definition Item.h:124
@ EQUIP_ERR_NOT_IN_COMBAT
Definition Item.h:107
@ EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED
Definition Item.h:60
@ EQUIP_ERR_NOT_WHILE_DISARMED
Definition Item.h:108
@ EQUIP_ERR_CANT_DO_RIGHT_NOW
Definition Item.h:86
@ EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER
Definition Item.h:80
@ EQUIP_ERR_YOU_ARE_STUNNED
Definition Item.h:84
@ EQUIP_ERR_INVENTORY_FULL
Definition Item.h:97
@ EQUIPMENT_SLOT_FINGER1
Definition Player.h:680
@ EQUIPMENT_SLOT_FINGER2
Definition Player.h:681
@ EQUIPMENT_SLOT_TRINKET1
Definition Player.h:682
@ EQUIPMENT_SLOT_TRINKET2
Definition Player.h:683
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ CLASS_CONTEXT_WEAPON_SWAP
Definition UnitDefines.h:245
Definition Battleground.h:294
bool m_lootGenerated
Definition Item.h:321
InventoryResult CanUnequipItem(uint16 src, bool swap) const
Definition PlayerStorage.cpp:1990
InventoryResult CanEquipUniqueItem(Item *pItem, uint8 except_slot=NULL_SLOT, uint32 limit_count=1) const
Definition Player.cpp:13837
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12246
uint8 FindEquipSlot(ItemTemplate const *proto, uint32 slot, bool swap) const
Definition PlayerStorage.cpp:126
bool CanChangeEquipStateInCombat() const
Definition ItemTemplate.h:705
uint32 ScalingStatDistribution
Definition ItemTemplate.h:649
uint32 SubClass
Definition ItemTemplate.h:622

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanDualWield(), CanEquipUniqueItem(), CanStoreItem(), CanTakeMoreSimilarItems(), CanTitanGrip(), CanUnequipItem(), Unit::CanUseAttackType(), CanUseItem(), ItemTemplate::Class, CLASS_CONTEXT_WEAPON_SWAP, CLASS_ROGUE, DEFAULT_MAX_LEVEL, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_EQUIP_ONLY1_AMMOPOUCH, EQUIP_ERR_CAN_EQUIP_ONLY1_QUIVER, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_DUAL_WIELD, EQUIP_ERR_CANT_EQUIP_WITH_TWOHANDED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_DOESNT_GO_TO_SLOT, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NO_EQUIPMENT_SLOT_AVAILABLE, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_STUNNED, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, FindEquipSlot(), GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Unit::GetLevel(), Item::GetTemplate(), Unit::HasUnitState(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_RELIC, INVTYPE_WEAPON, INVTYPE_WEAPONOFFHAND, Item::IsBindedNotWith(), IsClass(), Unit::IsInCombat(), Unit::IsNonMeleeSpellCast(), IsTwoHandUsed(), ITEM_CLASS_QUIVER, ITEM_CLASS_WEAPON, ITEM_SUBCLASS_AMMO_POUCH, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, LOG_DEBUG, Item::m_lootGenerated, m_weaponChangeTimer, ScalingStatDistributionEntry::MaxLevel, NULL_BAG, NULL_SLOT, ItemTemplate::ScalingStatDistribution, sScalingStatDistributionStore, sScriptMgr, sSpellMgr, STATUS_IN_PROGRESS, ItemTemplate::SubClass, and UNIT_STATE_STUNNED.

Referenced by _LoadInventory(), CanEquipNewItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleEquipmentSetUse(), SplitItem(), and SwapItem().

◆ CanEquipNewItem()

InventoryResult Player::CanEquipNewItem ( uint8  slot,
uint16 dest,
uint32  item,
bool  swap 
) const
1793{
1794 dest = 0;
1795 Item* pItem = Item::CreateItem(item, 1, this);
1796 if (pItem)
1797 {
1798 InventoryResult result = CanEquipItem(slot, dest, pItem, swap);
1799 delete pItem;
1800 return result;
1801 }
1802
1804}
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087

References CanEquipItem(), Item::CreateItem(), and EQUIP_ERR_ITEM_NOT_FOUND.

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ CanEquipUniqueItem() [1/2]

InventoryResult Player::CanEquipUniqueItem ( Item pItem,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13838{
13839 ItemTemplate const* pProto = pItem->GetTemplate();
13840
13841 // proto based limitations
13842 if (InventoryResult res = CanEquipUniqueItem(pProto, eslot, limit_count))
13843 return res;
13844
13845 // check unique-equipped on gems
13846 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
13847 {
13848 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
13849 if (!enchant_id)
13850 continue;
13851 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
13852 if (!enchantEntry)
13853 continue;
13854
13855 ItemTemplate const* pGem = sObjectMgr->GetItemTemplate(enchantEntry->GemID);
13856 if (!pGem)
13857 continue;
13858
13859 // include for check equip another gems with same limit category for not equipped item (and then not counted)
13860 uint32 gem_limit_count = !pItem->IsEquipped() && pGem->ItemLimitCategory
13862
13863 if (InventoryResult res = CanEquipUniqueItem(pGem, eslot, gem_limit_count))
13864 return res;
13865 }
13866
13867 return EQUIP_ERR_OK;
13868}
uint8 GetGemCountWithLimitCategory(uint32 limitCategory) const
Definition Item.cpp:1033
uint32 ItemLimitCategory
Definition ItemTemplate.h:687
uint32 GemID
Definition DBCStructure.h:1853

References CanEquipUniqueItem(), EQUIP_ERR_OK, SpellItemEnchantmentEntry::GemID, Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), Item::GetTemplate(), Item::IsEquipped(), ItemTemplate::ItemLimitCategory, sObjectMgr, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by CanEquipItem(), CanEquipUniqueItem(), and WorldSession::HandleSocketOpcode().

◆ CanEquipUniqueItem() [2/2]

InventoryResult Player::CanEquipUniqueItem ( ItemTemplate const *  itemProto,
uint8  except_slot = NULL_SLOT,
uint32  limit_count = 1 
) const
13871{
13872 // check unique-equipped on item
13873 if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE))
13874 {
13875 // there is an equip limit on this item
13876 if (HasItemOrGemWithIdEquipped(itemProto->ItemId, 1, except_slot))
13878 }
13879
13880 // check unique-equipped limit
13881 if (itemProto->ItemLimitCategory)
13882 {
13883 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(itemProto->ItemLimitCategory);
13884 if (!limitEntry)
13886
13887 // NOTE: limitEntry->mode not checked because if item have have-limit then it applied and to equip case
13888
13889 if (limit_count > limitEntry->maxCount)
13891
13892 // there is an equip limit on this item
13893 if (HasItemOrGemWithLimitCategoryEquipped(itemProto->ItemLimitCategory, limitEntry->maxCount - limit_count + 1, except_slot))
13895 }
13896
13897 return EQUIP_ERR_OK;
13898}
DBCStorage< ItemLimitCategoryEntry > sItemLimitCategoryStore(ItemLimitCategoryEntryfmt)
@ ITEM_FLAG_UNIQUE_EQUIPPABLE
Definition ItemTemplate.h:166
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED
Definition Item.h:135
@ EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE
Definition Item.h:114
@ EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED
Definition Item.h:121
bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition PlayerStorage.cpp:729
bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot=NULL_SLOT) const
Definition PlayerStorage.cpp:767
Definition DBCStructure.h:1197
uint32 maxCount
Definition DBCStructure.h:1201

References EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_UNIQUE_EQUIPABLE, EQUIP_ERR_OK, ItemTemplate::HasFlag(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), ITEM_FLAG_UNIQUE_EQUIPPABLE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemLimitCategoryEntry::maxCount, and sItemLimitCategoryStore.

◆ CanExecutePendingSpellCastRequest()

bool Player::CanExecutePendingSpellCastRequest ( SpellInfo const *  spellInfo)
2295{
2296 if (GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))
2297 return false;
2298
2299 if (GetSpellCooldownDelay(spellInfo->Id) > GetSpellQueueWindow())
2300 return false;
2301
2303 if (Spell* spell = GetCurrentSpell(spellSlot))
2304 {
2305 bool autoshot = spell->m_spellInfo->IsAutoRepeatRangedSpell();
2306 if (IsNonMeleeSpellCast(false, true, true, autoshot))
2307 return false;
2308 }
2309 return true;
2310}
CurrentSpellTypes
Definition Unit.h:538
@ CURRENT_MELEE_SPELL
Definition Unit.h:539
GlobalCooldownMgr & GetGlobalCooldownMgr()
Definition Player.h:1800
uint32 GetSpellQueueWindow() const
Definition PlayerUpdates.cpp:2289
uint32 GetSpellCooldownDelay(uint32 spell_id) const
Definition Player.cpp:16372

References CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Unit::GetCurrentSpell(), GetGlobalCooldownMgr(), GetSpellCooldownDelay(), GetSpellQueueWindow(), SpellInfo::Id, and Unit::IsNonMeleeSpellCast().

Referenced by WorldSession::HandleCastSpellOpcode(), WorldSession::HandleUseItemOpcode(), and ProcessSpellQueue().

◆ CanFly()

bool Player::CanFly ( ) const
inlineoverridevirtual

Implements Unit.

@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:393
MovementInfo m_movementInfo
Definition Object.h:693
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346

References MovementInfo::HasMovementFlag(), WorldObject::m_movementInfo, and MOVEMENTFLAG_CAN_FLY.

Referenced by gm_commandscript::HandleGMFlyCommand().

◆ canFlyInZone()

bool Player::canFlyInZone ( uint32  mapid,
uint32  zone,
SpellInfo const *  bySpell 
)
13692{
13693 if (!sScriptMgr->OnPlayerCanFlyInZone(this, mapid,zone,bySpell))
13694 {
13695 return false;
13696 }
13697
13698 // continent checked in SpellInfo::CheckLocation at cast and area update
13699 uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
13700 if (v_map == MAP_NORTHREND && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
13701 {
13702 if (!HasSpell(54197)) // 54197 = Cold Weather Flying
13703 {
13704 return false;
13705 }
13706 }
13707
13708 return true;
13709}
@ MAP_NORTHREND
Definition AreaDefines.h:242
uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId)
Definition DBCStores.cpp:703
@ SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT
Definition SharedDefines.h:674

References GetVirtualMapForMapAndZone(), SpellInfo::HasAttribute(), HasSpell(), MAP_NORTHREND, SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT, and sScriptMgr.

Referenced by SpellInfo::CheckLocation().

◆ CanInteractWithQuestGiver()

bool Player::CanInteractWithQuestGiver ( Object questGiver)
2057{
2058 switch (questGiver->GetTypeId())
2059 {
2060 case TYPEID_UNIT:
2061 return GetNPCIfCanInteractWith(questGiver->GetGUID(), UNIT_NPC_FLAG_QUESTGIVER) != nullptr;
2062 case TYPEID_GAMEOBJECT:
2063 return GetGameObjectIfCanInteractWith(questGiver->GetGUID(), GAMEOBJECT_TYPE_QUESTGIVER) != nullptr;
2064 case TYPEID_PLAYER:
2065 return IsAlive() && questGiver->ToPlayer()->IsAlive();
2066 case TYPEID_ITEM:
2067 return IsAlive();
2068 default:
2069 break;
2070 }
2071 return false;
2072}
@ GAMEOBJECT_TYPE_QUESTGIVER
Definition SharedDefines.h:1573
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:320
GameObject * GetGameObjectIfCanInteractWith(ObjectGuid const &guid, GameobjectTypes type) const
Definition Player.cpp:2131

References GAMEOBJECT_TYPE_QUESTGIVER, GetGameObjectIfCanInteractWith(), Object::GetGUID(), GetNPCIfCanInteractWith(), Object::GetTypeId(), Unit::IsAlive(), Object::ToPlayer(), TYPEID_GAMEOBJECT, TYPEID_ITEM, TYPEID_PLAYER, TYPEID_UNIT, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), and WorldSession::HandleQuestgiverRequestRewardOpcode().

◆ CanJoinConstantChannelInZone()

bool Player::CanJoinConstantChannelInZone ( ChatChannelsEntry const *  channel,
AreaTableEntry const *  zone 
)
4994{
4995 // Player can join LFG anywhere
4996 if (channel->flags & CHANNEL_DBC_FLAG_LFG && sWorld->getBoolConfig(CONFIG_LFG_LOCATION_ALL))
4997 return true;
4998
4999 if (channel->flags & CHANNEL_DBC_FLAG_ZONE_DEP && zone->flags & AREA_FLAG_ARENA_INSTANCE)
5000 return false;
5001
5002 if ((channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY) && (!(zone->flags & AREA_FLAG_SLAVE_CAPITAL)))
5003 return false;
5004
5005 if ((channel->flags & CHANNEL_DBC_FLAG_GUILD_REQ) && GetGuildId())
5006 return false;
5007
5008 return true;
5009}
@ CHANNEL_DBC_FLAG_CITY_ONLY
Definition Channel.h:97
@ CHANNEL_DBC_FLAG_GUILD_REQ
Definition Channel.h:100
@ CHANNEL_DBC_FLAG_ZONE_DEP
Definition Channel.h:94
@ CHANNEL_DBC_FLAG_LFG
Definition Channel.h:101
@ AREA_FLAG_ARENA_INSTANCE
Definition DBCEnums.h:250
@ AREA_FLAG_SLAVE_CAPITAL
Definition DBCEnums.h:237
@ CONFIG_LFG_LOCATION_ALL
Definition WorldConfig.h:116
uint32 GetGuildId() const
Definition Player.h:1896

References AREA_FLAG_ARENA_INSTANCE, AREA_FLAG_SLAVE_CAPITAL, CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GUILD_REQ, CHANNEL_DBC_FLAG_LFG, CHANNEL_DBC_FLAG_ZONE_DEP, CONFIG_LFG_LOCATION_ALL, AreaTableEntry::flags, ChatChannelsEntry::flags, GetGuildId(), and sWorld.

Referenced by UpdateLocalChannels().

◆ CanJoinToBattleground()

bool Player::CanJoinToBattleground ( ) const
11379{
11380 // check Deserter debuff
11381 if (HasAura(26013))
11382 return false;
11383
11384 return true;
11385}

References Unit::HasAura().

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattleFieldPortOpcode(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ CanKnockback()

bool Player::CanKnockback ( )
inline
2503{ return m_canKnockback; }

References m_canKnockback.

◆ CanNoReagentCast()

bool Player::CanNoReagentCast ( SpellInfo const *  spellInfo) const
12614{
12615 // don't take reagents for spells with SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
12617 return true;
12618
12619 // Check no reagent use mask
12620 flag96 noReagentMask;
12621 noReagentMask[0] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1);
12622 noReagentMask[1] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 1);
12623 noReagentMask[2] = GetUInt32Value(PLAYER_NO_REAGENT_COST_1 + 2);
12624 if (spellInfo->SpellFamilyFlags & noReagentMask)
12625 return true;
12626
12627 return false;
12628}
@ SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA
Definition SharedDefines.h:579
@ UNIT_FLAG_PREPARATION
Definition UnitDefines.h:259
@ PLAYER_NO_REAGENT_COST_1
Definition UpdateFields.h:387

References Object::GetUInt32Value(), SpellInfo::HasAttribute(), Unit::HasUnitFlag(), PLAYER_NO_REAGENT_COST_1, SPELL_ATTR5_NO_REAGENT_COST_WITH_AURA, SpellInfo::SpellFamilyFlags, and UNIT_FLAG_PREPARATION.

Referenced by Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), and Spell::TakeReagents().

◆ CanParry()

bool Player::CanParry ( ) const
inline

◆ CanPetResurrect()

bool Player::CanPetResurrect ( )
9233{
9234 PetStable* const petStable = GetPetStable();
9235 if (!petStable)
9236 {
9237 // No pets
9238 return false;
9239 }
9240
9241 auto const& currectPet = petStable->CurrentPet;
9242 auto const& unslottedHunterPet = petStable->GetUnslottedHunterPet();
9243
9244 if (!currectPet && !unslottedHunterPet)
9245 {
9246 // No pets
9247 return false;
9248 }
9249
9250 // Check current pet
9251 if (currectPet && !currectPet->Health)
9252 {
9253 return true;
9254 }
9255
9256 // Check dismiss/unslotted hunter pet
9257 if (unslottedHunterPet && !unslottedHunterPet->Health)
9258 {
9259 return true;
9260 }
9261
9262 return false;
9263}
Definition PetDefines.h:212
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:240
Optional< PetInfo > CurrentPet
Definition PetDefines.h:235
PetStable * GetPetStable()
Definition Player.h:1208

References PetStable::CurrentPet, GetPetStable(), and PetStable::GetUnslottedHunterPet().

◆ CanReportAfkDueToLimit()

bool Player::CanReportAfkDueToLimit ( )
11388{
11389 // a player can complain about 15 people per 5 minutes
11390 if (m_bgData.bgAfkReportedCount++ >= 15)
11391 return false;
11392
11393 return true;
11394}
BGData m_bgData
Definition Player.h:2690
uint8 bgAfkReportedCount
Definition Player.h:1038

References BGData::bgAfkReportedCount, and m_bgData.

Referenced by ReportedAfkBy().

◆ CanRequestSpellCast()

bool Player::CanRequestSpellCast ( SpellInfo const *  spellInfo)
2321{
2322 if (!sWorld->getBoolConfig(CONFIG_SPELL_QUEUE_ENABLED))
2323 return false;
2324
2325 // Check for existing cast request with the same category
2326 if (GetCastRequest(spellInfo->GetCategory()))
2327 return false;
2328
2329 if (GetGlobalCooldownMgr().GetGlobalCooldown(spellInfo) > GetSpellQueueWindow())
2330 return false;
2331
2332 if (GetSpellCooldownDelay(spellInfo->Id) > GetSpellQueueWindow())
2333 return false;
2334
2335 // If there is an existing cast that will last longer than the allowable
2336 // spell queue window, then we can't request a new spell cast
2338 if (Spell* spell = GetCurrentSpell(spellSlot))
2339 if (spell->GetCastTimeRemaining() > static_cast<int32>(GetSpellQueueWindow()))
2340 return false;
2341
2342 return true;
2343}
@ CONFIG_SPELL_QUEUE_ENABLED
Definition WorldConfig.h:146
const PendingSpellCastRequest * GetCastRequest(uint32 category) const
Definition PlayerUpdates.cpp:2312

References CONFIG_SPELL_QUEUE_ENABLED, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, GetCastRequest(), SpellInfo::GetCategory(), Unit::GetCurrentSpell(), GetGlobalCooldownMgr(), GetSpellCooldownDelay(), GetSpellQueueWindow(), SpellInfo::Id, and sWorld.

Referenced by WorldSession::HandleCastSpellOpcode(), and WorldSession::HandleUseItemOpcode().

◆ CanResummonPet()

bool Player::CanResummonPet ( uint32  spellid)
14305{
14307 {
14308 if (CanSeeDKPet())
14309 return true;
14310 else if (spellid == 52150) // Raise Dead
14311 return false;
14312 }
14313
14315 {
14316 if (HasSpell(31687) && HasAura(70937)) //Has [Summon Water Elemental] spell and [Glyph of Eternal Water].
14317 return true;
14318 }
14319
14321 {
14322 return true;
14323 }
14324
14325 return HasSpell(spellid);
14326}
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_CONTEXT_PET
Definition UnitDefines.h:240
bool CanSeeDKPet() const
Definition Player.h:2596

References CanSeeDKPet(), CLASS_CONTEXT_PET, CLASS_DEATH_KNIGHT, CLASS_HUNTER, CLASS_MAGE, Unit::HasAura(), HasSpell(), and IsClass().

Referenced by spell_gen_pet_summoned::HandleScript(), and ResummonPetTemporaryUnSummonedIfAny().

◆ CanRewardQuest() [1/2]

bool Player::CanRewardQuest ( Quest const *  quest,
bool  msg 
)
386{
387 // not auto complete quest and not completed quest (only cheating case, then ignore without message)
388 if (!quest->IsDFQuest() && !quest->IsAutoComplete() && quest->GetQuestMethod() && GetQuestStatus(quest->GetQuestId()) != QUEST_STATUS_COMPLETE)
389 return false;
390
391 // daily quest can't be rewarded (25 daily quest already completed)
392 if (!SatisfyQuestDay(quest, true) || !SatisfyQuestWeek(quest, true) || !SatisfyQuestMonth(quest, true) || !SatisfyQuestSeasonal(quest, true))
393 return false;
394
395 // rewarded and not repeatable quest (only cheating case, then ignore without message)
396 if (GetQuestRewardStatus(quest->GetQuestId()))
397 return false;
398
399 // prevent receive reward with quest items in bank
400 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
401 {
402 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
403 {
404 if (quest->RequiredItemCount[i] != 0 &&
405 GetItemCount(quest->RequiredItemId[i]) < quest->RequiredItemCount[i])
406 {
407 if (msg)
408 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, nullptr, nullptr, quest->RequiredItemId[i]);
409 return false;
410 }
411 }
412 }
413
414 // prevent receive reward with low money and GetRewOrReqMoney() < 0
415 if (quest->GetRewOrReqMoney() < 0 && !HasEnoughMoney(-quest->GetRewOrReqMoney()))
416 return false;
417
418 return true;
419}
bool SatisfyQuestDay(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1268
bool SatisfyQuestMonth(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1326
bool SatisfyQuestSeasonal(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1311
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition PlayerQuest.cpp:1430
bool SatisfyQuestWeek(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1302

References EQUIP_ERR_ITEM_NOT_FOUND, GetItemCount(), Quest::GetQuestId(), Quest::GetQuestMethod(), GetQuestRewardStatus(), GetQuestStatus(), Quest::GetRewOrReqMoney(), HasEnoughMoney(), Quest::HasSpecialFlag(), Quest::IsAutoComplete(), Quest::IsDFQuest(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_COMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, SatisfyQuestDay(), SatisfyQuestMonth(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), and SendEquipError().

Referenced by CanCompleteRepeatableQuest(), CanRewardQuest(), lfg::LFGMgr::FinishDungeon(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), npc_elder_clearwater::OnGossipHello(), and SendPreparedQuest().

◆ CanRewardQuest() [2/2]

bool Player::CanRewardQuest ( Quest const *  quest,
uint32  reward,
bool  msg 
)
469{
470 // prevent receive reward with quest items in bank or for not completed quest
471 if (!CanRewardQuest(quest, msg))
472 return false;
473
474 ItemPosCountVec dest;
475 if (quest->GetRewChoiceItemsCount() > 0)
476 {
477 if (quest->RewardChoiceItemId[reward])
478 {
479 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardChoiceItemId[reward], quest->RewardChoiceItemCount[reward]);
480 if (res != EQUIP_ERR_OK)
481 {
482 SendEquipError(res, nullptr, nullptr, quest->RewardChoiceItemId[reward]);
483 return false;
484 }
485 }
486 }
487
488 if (quest->GetRewItemsCount() > 0)
489 {
490 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
491 {
492 if (quest->RewardItemId[i])
493 {
494 InventoryResult res = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, quest->RewardItemId[i], quest->RewardItemIdCount[i]);
495 if (res != EQUIP_ERR_OK)
496 {
497 SendEquipError(res, nullptr, nullptr, quest->RewardItemId[i]);
498 return false;
499 }
500 }
501 }
502 }
503
504 return true;
505}

References CanRewardQuest(), CanStoreNewItem(), EQUIP_ERR_OK, Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), NULL_BAG, NULL_SLOT, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardItemId, Quest::RewardItemIdCount, and SendEquipError().

◆ CanRollForItemInLFG()

InventoryResult Player::CanRollForItemInLFG ( ItemTemplate const *  item,
WorldObject const *  lootedObject 
) const
2344{
2345 if (!GetGroup() || !GetGroup()->isLFGGroup(true))
2346 return EQUIP_ERR_OK; // not in LFG group
2347
2348 // check if looted object is inside the lfg dungeon
2349 Map const* map = lootedObject->GetMap();
2350 if (!sLFGMgr->inLfgDungeonMap(GetGroup()->GetGUID(), map->GetId(), map->GetDifficulty()))
2351 return EQUIP_ERR_OK;
2352
2353 if (!proto)
2355 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2356
2357 const static uint32 item_weapon_skills[MAX_ITEM_SUBCLASS_WEAPON] =
2358 {
2364 }; //Copy from function Item::GetSkill()
2365
2366 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2368
2369 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2371
2372 if (proto->RequiredSkill != 0)
2373 {
2374 if (!GetSkillValue(proto->RequiredSkill))
2376 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2378 }
2379
2380 if (proto->Class == ITEM_CLASS_WEAPON && GetSkillValue(item_weapon_skills[proto->SubClass]) == 0)
2382
2383 if (proto->Class == ITEM_CLASS_ARMOR)
2384 {
2385 // Check for shields
2386 if (proto->SubClass == ITEM_SUBCLASS_ARMOR_SHIELD && !(
2390 {
2392 }
2393
2394 // Check for librams.
2396 {
2398 }
2399
2400 // CHeck for idols.
2402 {
2404 }
2405
2406 // Check for totems.
2408 {
2410 }
2411
2412 // Check for sigils.
2414 {
2416 }
2417 }
2418
2419 if (proto->Class == ITEM_CLASS_ARMOR && proto->SubClass > ITEM_SUBCLASS_ARMOR_MISC && proto->SubClass < ITEM_SUBCLASS_ARMOR_BUCKLER &&
2420 proto->InventoryType != INVTYPE_CLOAK)
2421 {
2422 uint32 subclassToCompare = ITEM_SUBCLASS_ARMOR_CLOTH;
2424 {
2425 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2426 }
2428 {
2429 if ((proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat()))
2430 {
2432 }
2433 subclassToCompare = ITEM_SUBCLASS_ARMOR_PLATE;
2434 }
2436 {
2437 subclassToCompare = ITEM_SUBCLASS_ARMOR_MAIL;
2438 }
2440 {
2441 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2442 }
2444 {
2445 if (proto->HasStat(ITEM_MOD_SPELL_POWER) || proto->HasSpellPowerStat())
2446 {
2448 }
2449 subclassToCompare = ITEM_SUBCLASS_ARMOR_LEATHER;
2450 }
2451
2452 if (proto->SubClass > subclassToCompare)
2453 {
2455 }
2456 else if (sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION) && proto->ItemLevel > sWorld->getIntConfig(CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION))
2457 {
2458 if (proto->SubClass < subclassToCompare)
2459 {
2461 }
2462 }
2463 }
2464
2465 return EQUIP_ERR_OK;
2466}
@ INVTYPE_CLOAK
Definition ItemTemplate.h:272
@ ITEM_SUBCLASS_ARMOR_BUCKLER
Definition ItemTemplate.h:395
@ ITEM_SUBCLASS_ARMOR_LIBRAM
Definition ItemTemplate.h:397
@ ITEM_SUBCLASS_ARMOR_MISC
Definition ItemTemplate.h:390
@ ITEM_SUBCLASS_ARMOR_SIGIL
Definition ItemTemplate.h:400
@ ITEM_SUBCLASS_ARMOR_TOTEM
Definition ItemTemplate.h:399
@ ITEM_SUBCLASS_ARMOR_IDOL
Definition ItemTemplate.h:398
#define MAX_ITEM_SUBCLASS_WEAPON
Definition ItemTemplate.h:371
@ EQUIP_ERR_CANT_EQUIP_SKILL
Definition Item.h:49
@ EQUIP_ERR_NO_REQUIRED_PROFICIENCY
Definition Item.h:55
@ EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM
Definition Item.h:57
#define sLFGMgr
Definition LFGMgr.h:641
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ SKILL_BOWS
Definition SharedDefines.h:3123
@ SKILL_MACES
Definition SharedDefines.h:3127
@ SKILL_WANDS
Definition SharedDefines.h:3191
@ SKILL_GUNS
Definition SharedDefines.h:3124
@ SKILL_CROSSBOWS
Definition SharedDefines.h:3190
@ SKILL_THROWN
Definition SharedDefines.h:3164
@ SKILL_FISHING
Definition SharedDefines.h:3207
@ SKILL_SWORDS
Definition SharedDefines.h:3121
@ SKILL_DAGGERS
Definition SharedDefines.h:3163
@ SKILL_2H_AXES
Definition SharedDefines.h:3162
@ SKILL_POLEARMS
Definition SharedDefines.h:3192
@ SKILL_2H_SWORDS
Definition SharedDefines.h:3128
@ SKILL_FIST_WEAPONS
Definition SharedDefines.h:3216
@ SKILL_2H_MACES
Definition SharedDefines.h:3156
@ SKILL_AXES
Definition SharedDefines.h:3122
@ SKILL_STAVES
Definition SharedDefines.h:3144
@ SKILL_ASSASSINATION
Definition SharedDefines.h:3196
@ CLASS_CONTEXT_EQUIP_SHIELDS
Definition UnitDefines.h:243
@ CLASS_CONTEXT_EQUIP_RELIC
Definition UnitDefines.h:242
@ CLASS_CONTEXT_EQUIP_ARMOR_CLASS
Definition UnitDefines.h:244
@ CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION
Definition WorldConfig.h:374
uint32 GetId() const
Definition Map.h:229
Difficulty GetDifficulty() const
Definition Map.h:290
uint32 getRaceMask() const
Definition Unit.h:821

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_CONTEXT_EQUIP_RELIC, CLASS_CONTEXT_EQUIP_SHIELDS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_PALADIN, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARRIOR, CONFIG_LOOT_NEED_BEFORE_GREED_ILVL_RESTRICTION, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Map::GetDifficulty(), GetGroup(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), Unit::getRaceMask(), GetSkillValue(), HasSpell(), ItemTemplate::HasSpellPowerStat(), ItemTemplate::HasStat(), ItemTemplate::InventoryType, INVTYPE_CLOAK, IsClass(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, ITEM_MOD_SPELL_POWER, ITEM_SUBCLASS_ARMOR_BUCKLER, ITEM_SUBCLASS_ARMOR_CLOTH, ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LEATHER, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MAIL, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_PLATE, ITEM_SUBCLASS_ARMOR_SHIELD, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ItemTemplate::ItemLevel, MAX_ITEM_SUBCLASS_WEAPON, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, SKILL_2H_AXES, SKILL_2H_MACES, SKILL_2H_SWORDS, SKILL_ASSASSINATION, SKILL_AXES, SKILL_BOWS, SKILL_CROSSBOWS, SKILL_DAGGERS, SKILL_FISHING, SKILL_FIST_WEAPONS, SKILL_GUNS, SKILL_MACES, SKILL_POLEARMS, SKILL_STAVES, SKILL_SWORDS, SKILL_THROWN, SKILL_WANDS, sLFGMgr, ItemTemplate::SubClass, and sWorld.

Referenced by Group::NeedBeforeGreed().

◆ CanSeeDKPet()

bool Player::CanSeeDKPet ( ) const
inline

◆ CanSeeSpellClickOn()

bool Player::CanSeeSpellClickOn ( Creature const *  creature) const
14329{
14330 if (!c->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
14331 return false;
14332
14333 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(c->GetEntry());
14334 if (clickPair.first == clickPair.second)
14335 return true;
14336
14337 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
14338 {
14339 if (!itr->second.IsFitToRequirements(this, c))
14340 return false;
14341
14342 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(c->GetEntry(), itr->second.spellId);
14343 ConditionSourceInfo info = ConditionSourceInfo(const_cast<Player*>(this), const_cast<Creature*>(c));
14344 if (sConditionMgr->IsObjectMeetToConditions(info, conds))
14345 return true;
14346 }
14347
14348 return false;
14349}
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:343
Definition ConditionMgr.h:183

References Object::GetEntry(), Unit::HasNpcFlag(), sConditionMgr, sObjectMgr, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Unit::PatchValuesUpdate().

◆ CanSeeStartQuest()

bool Player::CanSeeStartQuest ( Quest const *  quest)
238{
239 if (!sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this) && SatisfyQuestClass(quest, false) && SatisfyQuestRace(quest, false) &&
240 SatisfyQuestSkill(quest, false) && SatisfyQuestExclusiveGroup(quest, false) && SatisfyQuestReputation(quest, false) &&
241 SatisfyQuestPreviousQuest(quest, false) && SatisfyQuestNextChain(quest, false) &&
242 SatisfyQuestPrevChain(quest, false) && SatisfyQuestDay(quest, false) && SatisfyQuestWeek(quest, false) &&
243 SatisfyQuestMonth(quest, false) && SatisfyQuestSeasonal(quest, false))
244 {
245 return GetLevel() + sWorld->getIntConfig(CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF) >= quest->GetMinLevel();
246 }
247
248 return false;
249}
#define sDisableMgr
Definition DisableMgr.h:88
@ DISABLE_TYPE_QUEST
Definition DisableMgr.h:29
@ CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF
Definition WorldConfig.h:240
bool SatisfyQuestNextChain(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1220
bool SatisfyQuestExclusiveGroup(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1183
bool SatisfyQuestRace(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1103
bool SatisfyQuestClass(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1085
bool SatisfyQuestReputation(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1117
bool SatisfyQuestPreviousQuest(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:999
bool SatisfyQuestSkill(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:947
bool SatisfyQuestPrevChain(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1240

References CONFIG_QUEST_HIGH_LEVEL_HIDE_DIFF, DISABLE_TYPE_QUEST, Unit::GetLevel(), Quest::GetMinLevel(), Quest::GetQuestId(), SatisfyQuestClass(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestWeek(), sDisableMgr, and sWorld.

Referenced by npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverCompleteQuest().

◆ CanSeeVendor()

bool Player::CanSeeVendor ( Creature const *  creature) const
14419{
14420 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_VENDOR))
14421 return true;
14422
14423 ConditionList conditions = sConditionMgr->GetConditionsForNpcVendorEvent(creature->GetEntry(), 0);
14424 if (!sConditionMgr->IsObjectMeetToConditions(const_cast<Player*>(this), const_cast<Creature*>(creature), conditions))
14425 return false;
14426
14427 uint32 const menuId = creature->GetCreatureTemplate()->GossipMenuId;
14428 if (!AnyVendorOptionAvailable(menuId, creature))
14429 return false;
14430
14431 return true;
14432}
bool AnyVendorOptionAvailable(uint32 menuId, Creature const *creature) const
Checks if any vendor option is available in the gossip menu tree for a given creature.
Definition Player.cpp:14358

References AnyVendorOptionAvailable(), Creature::GetCreatureTemplate(), Object::GetEntry(), CreatureTemplate::GossipMenuId, Unit::HasNpcFlag(), sConditionMgr, and UNIT_NPC_FLAG_VENDOR.

Referenced by Unit::PatchValuesUpdate().

◆ CanShareQuest()

bool Player::CanShareQuest ( uint32  quest_id) const
1459{
1460 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1461 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_SHARABLE))
1462 {
1463 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1464 if (itr != m_QuestStatus.end())
1465 {
1466 // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share
1467 if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id))
1468 {
1470 return false;
1471 }
1472
1473 return true;
1474 }
1475 }
1476 return false;
1477}
#define sPoolMgr
Definition PoolMgr.h:163
@ QUEST_FLAGS_SHARABLE
Definition QuestDef.h:135
@ QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY
Definition QuestDef.h:74
void SendPushToPartyResponse(Player const *player, uint8 msg) const
Definition PlayerQuest.cpp:2435
bool HasFlag(uint32 flag) const
Definition QuestDef.h:221

References Quest::HasFlag(), m_QuestStatus, QUEST_FLAGS_SHARABLE, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY, SendPushToPartyResponse(), sObjectMgr, and sPoolMgr.

Referenced by WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ CanSpeak()

bool Player::CanSpeak ( ) const
70{
71 return GetSession()->m_muteTime <= time (nullptr);
72}
time_t m_muteTime
Definition WorldSession.h:556

References GetSession(), and WorldSession::m_muteTime.

Referenced by WorldSession::HandleMessagechatOpcode(), and misc_commandscript::HandleUnmuteCommand().

◆ CanStoreItem() [1/2]

◆ CanStoreItem() [2/2]

InventoryResult Player::CanStoreItem ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
uint32  entry,
uint32  count,
Item pItem = nullptr,
bool  swap = false,
uint32 no_space_count = nullptr 
) const
1103{
1104 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItem bag = {}, slot = {}, item = {}, count = {}", bag, slot, entry, count);
1105
1106 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
1107 if (!pProto)
1108 {
1109 if (no_space_count)
1110 *no_space_count = count;
1112 }
1113
1114 if (pItem)
1115 {
1116 // you bad chet0rz, wpe pro
1117 if (bag == NULL_BAG && slot == NULL_SLOT)
1118 if (pItem->IsBag() && pItem->IsNotEmptyBag())
1120
1121 // Xinef: Removed next loot generated check
1122 if (pItem->GetGUID() == GetLootGUID())
1123 {
1124 if (no_space_count)
1125 *no_space_count = count;
1127 }
1128
1129 if (pItem->IsBindedNotWith(this))
1130 {
1131 if (no_space_count)
1132 *no_space_count = count;
1134 }
1135 }
1136
1137 // check count of items (skip for auto move for same player from bank)
1138 uint32 no_similar_count = 0; // can't store this amount similar items
1139 InventoryResult res = CanTakeMoreSimilarItems(entry, count, pItem, &no_similar_count);
1140 if (res != EQUIP_ERR_OK)
1141 {
1142 if (count == no_similar_count)
1143 {
1144 if (no_space_count)
1145 *no_space_count = no_similar_count;
1146 return res;
1147 }
1148 count -= no_similar_count;
1149 }
1150
1151 // in specific slot
1152 if (bag != NULL_BAG && slot != NULL_SLOT)
1153 {
1154 res = CanStoreItem_InSpecificSlot(bag, slot, dest, pProto, count, swap, pItem);
1155 if (res != EQUIP_ERR_OK)
1156 {
1157 if (no_space_count)
1158 *no_space_count = count + no_similar_count;
1159 return res;
1160 }
1161
1162 if (count == 0)
1163 {
1164 if (no_similar_count == 0)
1165 return EQUIP_ERR_OK;
1166
1167 if (no_space_count)
1168 *no_space_count = count + no_similar_count;
1170 }
1171 }
1172
1173 // not specific slot or have space for partly store only in specific slot
1174
1175 // in specific bag
1176 if (bag != NULL_BAG)
1177 {
1178 // search stack in bag for merge to
1179 if (pProto->Stackable != 1)
1180 {
1181 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1182 {
1183 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1184 if (res != EQUIP_ERR_OK)
1185 {
1186 if (no_space_count)
1187 *no_space_count = count + no_similar_count;
1188 return res;
1189 }
1190
1191 if (count == 0)
1192 {
1193 if (no_similar_count == 0)
1194 return EQUIP_ERR_OK;
1195
1196 if (no_space_count)
1197 *no_space_count = count + no_similar_count;
1199 }
1200
1201 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1202 if (res != EQUIP_ERR_OK)
1203 {
1204 if (no_space_count)
1205 *no_space_count = count + no_similar_count;
1206 return res;
1207 }
1208
1209 if (count == 0)
1210 {
1211 if (no_similar_count == 0)
1212 return EQUIP_ERR_OK;
1213
1214 if (no_space_count)
1215 *no_space_count = count + no_similar_count;
1217 }
1218 }
1219 else // equipped bag
1220 {
1221 // we need check 2 time (specialized/non_specialized), use NULL_BAG to prevent skipping bag
1222 res = CanStoreItem_InBag(bag, dest, pProto, count, true, false, pItem, NULL_BAG, slot);
1223 if (res != EQUIP_ERR_OK)
1224 res = CanStoreItem_InBag(bag, dest, pProto, count, true, true, pItem, NULL_BAG, slot);
1225
1226 if (res != EQUIP_ERR_OK)
1227 {
1228 if (no_space_count)
1229 *no_space_count = count + no_similar_count;
1230 return res;
1231 }
1232
1233 if (count == 0)
1234 {
1235 if (no_similar_count == 0)
1236 return EQUIP_ERR_OK;
1237
1238 if (no_space_count)
1239 *no_space_count = count + no_similar_count;
1241 }
1242 }
1243 }
1244
1245 // search free slot in bag for place to
1246 if (bag == INVENTORY_SLOT_BAG_0) // inventory
1247 {
1248 // search free slot - keyring case
1249 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1250 {
1251 uint32 keyringSize = GetMaxKeyringSize();
1252 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1253 if (res != EQUIP_ERR_OK)
1254 {
1255 if (no_space_count)
1256 *no_space_count = count + no_similar_count;
1257 return res;
1258 }
1259
1260 if (count == 0)
1261 {
1262 if (no_similar_count == 0)
1263 return EQUIP_ERR_OK;
1264
1265 if (no_space_count)
1266 *no_space_count = count + no_similar_count;
1268 }
1269
1270 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1271 if (res != EQUIP_ERR_OK)
1272 {
1273 if (no_space_count)
1274 *no_space_count = count + no_similar_count;
1275 return res;
1276 }
1277
1278 if (count == 0)
1279 {
1280 if (no_similar_count == 0)
1281 return EQUIP_ERR_OK;
1282
1283 if (no_space_count)
1284 *no_space_count = count + no_similar_count;
1286 }
1287 }
1288 else if (pProto->IsCurrencyToken())
1289 {
1290 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1291 if (res != EQUIP_ERR_OK)
1292 {
1293 if (no_space_count)
1294 *no_space_count = count + no_similar_count;
1295 return res;
1296 }
1297
1298 if (count == 0)
1299 {
1300 if (no_similar_count == 0)
1301 return EQUIP_ERR_OK;
1302
1303 if (no_space_count)
1304 *no_space_count = count + no_similar_count;
1306 }
1307 }
1308
1309 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1310 if (res != EQUIP_ERR_OK)
1311 {
1312 if (no_space_count)
1313 *no_space_count = count + no_similar_count;
1314 return res;
1315 }
1316
1317 if (count == 0)
1318 {
1319 if (no_similar_count == 0)
1320 return EQUIP_ERR_OK;
1321
1322 if (no_space_count)
1323 *no_space_count = count + no_similar_count;
1325 }
1326 }
1327 else // equipped bag
1328 {
1329 res = CanStoreItem_InBag(bag, dest, pProto, count, false, false, pItem, NULL_BAG, slot);
1330 if (res != EQUIP_ERR_OK)
1331 res = CanStoreItem_InBag(bag, dest, pProto, count, false, true, pItem, NULL_BAG, slot);
1332
1333 if (res != EQUIP_ERR_OK)
1334 {
1335 if (no_space_count)
1336 *no_space_count = count + no_similar_count;
1337 return res;
1338 }
1339
1340 if (count == 0)
1341 {
1342 if (no_similar_count == 0)
1343 return EQUIP_ERR_OK;
1344
1345 if (no_space_count)
1346 *no_space_count = count + no_similar_count;
1348 }
1349 }
1350 }
1351
1352 // not specific bag or have space for partly store only in specific bag
1353
1354 // search stack for merge to
1355 if (pProto->Stackable != 1)
1356 {
1357 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, true, pItem, bag, slot);
1358 if (res != EQUIP_ERR_OK)
1359 {
1360 if (no_space_count)
1361 *no_space_count = count + no_similar_count;
1362 return res;
1363 }
1364
1365 if (count == 0)
1366 {
1367 if (no_similar_count == 0)
1368 return EQUIP_ERR_OK;
1369
1370 if (no_space_count)
1371 *no_space_count = count + no_similar_count;
1373 }
1374
1375 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, true, pItem, bag, slot);
1376 if (res != EQUIP_ERR_OK)
1377 {
1378 if (no_space_count)
1379 *no_space_count = count + no_similar_count;
1380 return res;
1381 }
1382
1383 if (count == 0)
1384 {
1385 if (no_similar_count == 0)
1386 return EQUIP_ERR_OK;
1387
1388 if (no_space_count)
1389 *no_space_count = count + no_similar_count;
1391 }
1392
1393 if (pProto->BagFamily)
1394 {
1396 {
1397 res = CanStoreItem_InBag(i, dest, pProto, count, true, false, pItem, bag, slot);
1398 if (res != EQUIP_ERR_OK)
1399 continue;
1400
1401 if (count == 0)
1402 {
1403 if (no_similar_count == 0)
1404 return EQUIP_ERR_OK;
1405
1406 if (no_space_count)
1407 *no_space_count = count + no_similar_count;
1409 }
1410 }
1411 }
1412
1414 {
1415 res = CanStoreItem_InBag(i, dest, pProto, count, true, true, pItem, bag, slot);
1416 if (res != EQUIP_ERR_OK)
1417 continue;
1418
1419 if (count == 0)
1420 {
1421 if (no_similar_count == 0)
1422 return EQUIP_ERR_OK;
1423
1424 if (no_space_count)
1425 *no_space_count = count + no_similar_count;
1427 }
1428 }
1429 }
1430
1431 // search free slot - special bag case
1432 if (pProto->BagFamily)
1433 {
1434 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1435 {
1436 uint32 keyringSize = GetMaxKeyringSize();
1437 res = CanStoreItem_InInventorySlots(KEYRING_SLOT_START, KEYRING_SLOT_START + keyringSize, dest, pProto, count, false, pItem, bag, slot);
1438 if (res != EQUIP_ERR_OK)
1439 {
1440 if (no_space_count)
1441 *no_space_count = count + no_similar_count;
1442 return res;
1443 }
1444
1445 if (count == 0)
1446 {
1447 if (no_similar_count == 0)
1448 return EQUIP_ERR_OK;
1449
1450 if (no_space_count)
1451 *no_space_count = count + no_similar_count;
1453 }
1454 }
1455 else if (pProto->IsCurrencyToken())
1456 {
1457 res = CanStoreItem_InInventorySlots(CURRENCYTOKEN_SLOT_START, CURRENCYTOKEN_SLOT_END, dest, pProto, count, false, pItem, bag, slot);
1458 if (res != EQUIP_ERR_OK)
1459 {
1460 if (no_space_count)
1461 *no_space_count = count + no_similar_count;
1462 return res;
1463 }
1464
1465 if (count == 0)
1466 {
1467 if (no_similar_count == 0)
1468 return EQUIP_ERR_OK;
1469
1470 if (no_space_count)
1471 *no_space_count = count + no_similar_count;
1473 }
1474 }
1475
1477 {
1478 res = CanStoreItem_InBag(i, dest, pProto, count, false, false, pItem, bag, slot);
1479 if (res != EQUIP_ERR_OK)
1480 continue;
1481
1482 if (count == 0)
1483 {
1484 if (no_similar_count == 0)
1485 return EQUIP_ERR_OK;
1486
1487 if (no_space_count)
1488 *no_space_count = count + no_similar_count;
1490 }
1491 }
1492 }
1493
1494 if (pItem && pItem->IsNotEmptyBag())
1496
1497 // search free slot
1498 res = CanStoreItem_InInventorySlots(INVENTORY_SLOT_ITEM_START, INVENTORY_SLOT_ITEM_END, dest, pProto, count, false, pItem, bag, slot);
1499 if (res != EQUIP_ERR_OK)
1500 {
1501 if (no_space_count)
1502 *no_space_count = count + no_similar_count;
1503 return res;
1504 }
1505
1506 if (count == 0)
1507 {
1508 if (no_similar_count == 0)
1509 return EQUIP_ERR_OK;
1510
1511 if (no_space_count)
1512 *no_space_count = count + no_similar_count;
1514 }
1515
1517 {
1518 res = CanStoreItem_InBag(i, dest, pProto, count, false, true, pItem, bag, slot);
1519 if (res != EQUIP_ERR_OK)
1520 continue;
1521
1522 if (count == 0)
1523 {
1524 if (no_similar_count == 0)
1525 return EQUIP_ERR_OK;
1526
1527 if (no_space_count)
1528 *no_space_count = count + no_similar_count;
1530 }
1531 }
1532
1533 if (no_space_count)
1534 *no_space_count = count + no_similar_count;
1535
1537}
@ BAG_FAMILY_MASK_KEYS
Definition ItemTemplate.h:235
@ EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS
Definition Item.h:78
@ INVENTORY_SLOT_ITEM_START
Definition Player.h:700
@ INVENTORY_SLOT_ITEM_END
Definition Player.h:701
uint32 GetMaxKeyringSize() const
Definition Player.h:1353
bool IsCurrencyToken() const
Definition ItemTemplate.h:725

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanTakeMoreSimilarItems(), CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, Object::GetGUID(), GetLootGUID(), GetMaxKeyringSize(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBag(), Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsNotEmptyBag(), KEYRING_SLOT_START, LOG_DEBUG, NULL_BAG, NULL_SLOT, sObjectMgr, and ItemTemplate::Stackable.

◆ CanStoreItem_InBag()

InventoryResult Player::CanStoreItem_InBag ( uint8  bag,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
bool  non_specialized,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
982{
983 // skip specific bag already processed in first called CanStoreItem_InBag
984 if (bag == skip_bag)
986
987 // skip not existed bag or self targeted bag
988 Bag* pBag = GetBagByPos(bag);
989 if (!pBag || pBag == pSrcItem || (pSrcItem && (pSrcItem->GetGUID() == pBag->GetGUID())))
991
992 if (pSrcItem && pSrcItem->IsNotEmptyBag())
994
995 ItemTemplate const* pBagProto = pBag->GetTemplate();
996 if (!pBagProto)
998
999 // specialized bag mode or non-specilized
1000 if (non_specialized != (pBagProto->Class == ITEM_CLASS_CONTAINER && pBagProto->SubClass == ITEM_SUBCLASS_CONTAINER))
1002
1003 if (!ItemCanGoIntoBag(pProto, pBagProto))
1005
1006 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1007 {
1008 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1009 if (j == skip_slot)
1010 continue;
1011
1012 Item* pItem2 = GetItemByPos(bag, j);
1013
1014 // ignore move item (this slot will be empty at move)
1015 if (pItem2 == pSrcItem)
1016 pItem2 = nullptr;
1017
1018 // if merge skip empty, if !merge skip non-empty
1019 if ((pItem2 != nullptr) != merge)
1020 continue;
1021
1022 uint32 need_space = pProto->GetMaxStackSize();
1023
1024 if (pItem2)
1025 {
1026 // can be merged at least partly
1027 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1028 if (res != EQUIP_ERR_OK)
1029 continue;
1030
1031 // descrease at current stacksize
1032 need_space -= pItem2->GetCount();
1033 }
1034
1035 if (need_space > count)
1036 need_space = count;
1037
1038 ItemPosCount newPosition = ItemPosCount((bag << 8) | j, need_space);
1039 if (!newPosition.isContainedIn(dest))
1040 {
1041 dest.push_back(newPosition);
1042 count -= need_space;
1043
1044 if (count == 0)
1045 return EQUIP_ERR_OK;
1046 }
1047 }
1048 return EQUIP_ERR_OK;
1049}
@ ITEM_SUBCLASS_CONTAINER
Definition ItemTemplate.h:329
@ ITEM_CLASS_CONTAINER
Definition ItemTemplate.h:292
bool ItemCanGoIntoBag(ItemTemplate const *pProto, ItemTemplate const *pBagProto)
Definition Item.cpp:176
@ EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG
Definition Item.h:62
uint32 GetBagSize() const
Definition Bag.h:48
InventoryResult CanBeMergedPartlyWith(ItemTemplate const *proto) const
Definition Item.cpp:867
Definition Player.h:760
bool isContainedIn(std::vector< ItemPosCount > const &vec) const
Definition Player.cpp:13195

References Item::CanBeMergedPartlyWith(), ItemTemplate::Class, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Bag::GetBagSize(), Item::GetCount(), Object::GetGUID(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), ItemPosCount::isContainedIn(), Item::IsNotEmptyBag(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), and ItemTemplate::SubClass.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InInventorySlots()

InventoryResult Player::CanStoreItem_InInventorySlots ( uint8  slot_begin,
uint8  slot_end,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  merge,
Item pSrcItem,
uint8  skip_bag,
uint8  skip_slot 
) const
private
1052{
1053 //this is never called for non-bag slots so we can do this
1054 if (pSrcItem && pSrcItem->IsNotEmptyBag())
1056
1057 for (uint32 j = slot_begin; j < slot_end; j++)
1058 {
1059 // skip specific slot already processed in first called CanStoreItem_InSpecificSlot
1060 if (INVENTORY_SLOT_BAG_0 == skip_bag && j == skip_slot)
1061 continue;
1062
1064
1065 // ignore move item (this slot will be empty at move)
1066 if (pItem2 == pSrcItem)
1067 pItem2 = nullptr;
1068
1069 // if merge skip empty, if !merge skip non-empty
1070 if ((pItem2 != nullptr) != merge)
1071 continue;
1072
1073 uint32 need_space = pProto->GetMaxStackSize();
1074
1075 if (pItem2)
1076 {
1077 // can be merged at least partly
1078 uint8 res = pItem2->CanBeMergedPartlyWith(pProto);
1079 if (res != EQUIP_ERR_OK)
1080 continue;
1081
1082 // descrease at current stacksize
1083 need_space -= pItem2->GetCount();
1084 }
1085
1086 if (need_space > count)
1087 need_space = count;
1088
1089 ItemPosCount newPosition = ItemPosCount((INVENTORY_SLOT_BAG_0 << 8) | j, need_space);
1090 if (!newPosition.isContainedIn(dest))
1091 {
1092 dest.push_back(newPosition);
1093 count -= need_space;
1094
1095 if (count == 0)
1096 return EQUIP_ERR_OK;
1097 }
1098 }
1099 return EQUIP_ERR_OK;
1100}

References Item::CanBeMergedPartlyWith(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_OK, Item::GetCount(), GetItemByPos(), ItemTemplate::GetMaxStackSize(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), and Item::IsNotEmptyBag().

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItem_InSpecificSlot()

InventoryResult Player::CanStoreItem_InSpecificSlot ( uint8  bag,
uint8  slot,
ItemPosCountVec dest,
ItemTemplate const *  pProto,
uint32 count,
bool  swap,
Item pSrcItem 
) const
private
911{
912 Item* pItem2 = GetItemByPos(bag, slot);
913
914 // ignore move item (this slot will be empty at move)
915 if (pItem2 == pSrcItem)
916 pItem2 = nullptr;
917
918 uint32 need_space;
919
920 // empty specific slot - check item fit to slot
921 if (!pItem2 || swap)
922 {
923 if (bag == INVENTORY_SLOT_BAG_0)
924 {
925 // keyring case
926 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_START + GetMaxKeyringSize() && !(pProto->BagFamily & BAG_FAMILY_MASK_KEYS))
928
929 // currencytoken case
930 if (slot >= CURRENCYTOKEN_SLOT_START && slot < CURRENCYTOKEN_SLOT_END && !(pProto->IsCurrencyToken()))
932
933 // prevent cheating
934 if ((slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END) || slot >= PLAYER_SLOT_END)
936 }
937 else
938 {
939 Bag* pBag = GetBagByPos(bag);
940 if (!pBag)
942
943 ItemTemplate const* pBagProto = pBag->GetTemplate();
944 if (!pBagProto)
946
947 if (slot >= pBagProto->ContainerSlots)
949
950 if (!ItemCanGoIntoBag(pProto, pBagProto))
952 }
953
954 // non empty stack with space
955 need_space = pProto->GetMaxStackSize();
956 }
957 // non empty slot, check item type
958 else
959 {
960 // can be merged at least partly
961 InventoryResult res = pItem2->CanBeMergedPartlyWith(pProto);
962 if (res != EQUIP_ERR_OK)
963 return res;
964
965 // free stack space or infinity
966 need_space = pProto->GetMaxStackSize() - pItem2->GetCount();
967 }
968
969 if (need_space > count)
970 need_space = count;
971
972 ItemPosCount newPosition = ItemPosCount((bag << 8) | slot, need_space);
973 if (!newPosition.isContainedIn(dest))
974 {
975 dest.push_back(newPosition);
976 count -= need_space;
977 }
978 return EQUIP_ERR_OK;
979}
uint32 ContainerSlots
Definition ItemTemplate.h:646

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, BUYBACK_SLOT_END, BUYBACK_SLOT_START, Item::CanBeMergedPartlyWith(), ItemTemplate::ContainerSlots, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), GetItemByPos(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemPosCount::isContainedIn(), ItemTemplate::IsCurrencyToken(), ItemCanGoIntoBag(), KEYRING_SLOT_START, and PLAYER_SLOT_END.

Referenced by CanBankItem(), and CanStoreItem().

◆ CanStoreItems()

InventoryResult Player::CanStoreItems ( Item **  pItem,
int32  count 
) const
1541{
1542 Item* pItem2;
1543
1544 // fill space table
1547 int inv_keys[KEYRING_SLOT_END - KEYRING_SLOT_START];
1549
1550 memset(inv_slot_items, 0, sizeof(int) * (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START));
1551 memset(inv_bags, 0, sizeof(int) * (INVENTORY_SLOT_BAG_END - INVENTORY_SLOT_BAG_START) * MAX_BAG_SIZE);
1552 memset(inv_keys, 0, sizeof(int) * (KEYRING_SLOT_END - KEYRING_SLOT_START));
1553 memset(inv_tokens, 0, sizeof(int) * (CURRENCYTOKEN_SLOT_END - CURRENCYTOKEN_SLOT_START));
1554
1556 {
1558 if (pItem2 && !pItem2->IsInTrade())
1559 inv_slot_items[i - INVENTORY_SLOT_ITEM_START] = pItem2->GetCount();
1560 }
1561
1562 for (uint8 i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
1563 {
1565 if (pItem2 && !pItem2->IsInTrade())
1566 inv_keys[i - KEYRING_SLOT_START] = pItem2->GetCount();
1567 }
1568
1570 {
1572 if (pItem2 && !pItem2->IsInTrade())
1573 inv_tokens[i - CURRENCYTOKEN_SLOT_START] = pItem2->GetCount();
1574 }
1575
1577 if (Bag* pBag = GetBagByPos(i))
1578 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
1579 {
1580 pItem2 = GetItemByPos(i, j);
1581 if (pItem2 && !pItem2->IsInTrade())
1582 inv_bags[i - INVENTORY_SLOT_BAG_START][j] = pItem2->GetCount();
1583 }
1584
1585 // check free space for all items
1586 for (int k = 0; k < count; ++k)
1587 {
1588 Item* pItem = pItems[k];
1589
1590 // no item
1591 if (!pItem)
1592 continue;
1593
1594 LOG_DEBUG("entities.player.items", "STORAGE: CanStoreItems {}. item = {}, count = {}", k + 1, pItem->GetEntry(), pItem->GetCount());
1595 ItemTemplate const* pProto = pItem->GetTemplate();
1596
1597 // strange item
1598 if (!pProto)
1600
1601 // Xinef: Removed next loot generated check
1602 if (pItem->GetGUID() == GetLootGUID())
1604
1605 // item it 'bind'
1606 if (pItem->IsBindedNotWith(this))
1608
1609 ItemTemplate const* pBagProto;
1610
1611 // item is 'one item only'
1613 if (res != EQUIP_ERR_OK)
1614 return res;
1615
1616 // search stack for merge to
1617 if (pProto->Stackable != 1)
1618 {
1619 bool b_found = false;
1620
1621 for (uint8 t = KEYRING_SLOT_START; t < KEYRING_SLOT_END; ++t)
1622 {
1624 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_keys[t - KEYRING_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1625 {
1626 inv_keys[t - KEYRING_SLOT_START] += pItem->GetCount();
1627 b_found = true;
1628 break;
1629 }
1630 }
1631 if (b_found)
1632 continue;
1633
1634 for (int t = CURRENCYTOKEN_SLOT_START; t < CURRENCYTOKEN_SLOT_END; ++t)
1635 {
1637 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_tokens[t - CURRENCYTOKEN_SLOT_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1638 {
1639 inv_tokens[t - CURRENCYTOKEN_SLOT_START] += pItem->GetCount();
1640 b_found = true;
1641 break;
1642 }
1643 }
1644 if (b_found)
1645 continue;
1646
1648 {
1650 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_slot_items[t - INVENTORY_SLOT_ITEM_START] + pItem->GetCount() <= pProto->GetMaxStackSize())
1651 {
1652 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] += pItem->GetCount();
1653 b_found = true;
1654 break;
1655 }
1656 }
1657 if (b_found)
1658 continue;
1659
1660 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1661 {
1662 if (Bag* bag = GetBagByPos(t))
1663 {
1664 if (ItemCanGoIntoBag(pItem->GetTemplate(), bag->GetTemplate()))
1665 {
1666 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1667 {
1668 pItem2 = GetItemByPos(t, j);
1669 if (pItem2 && pItem2->CanBeMergedPartlyWith(pProto) == EQUIP_ERR_OK && inv_bags[t - INVENTORY_SLOT_BAG_START][j] + pItem->GetCount() <= pProto->GetMaxStackSize())
1670 {
1671 inv_bags[t - INVENTORY_SLOT_BAG_START][j] += pItem->GetCount();
1672 b_found = true;
1673 break;
1674 }
1675 }
1676 }
1677 }
1678 }
1679 if (b_found)
1680 continue;
1681 }
1682
1683 // special bag case
1684 if (pProto->BagFamily)
1685 {
1686 bool b_found = false;
1687 if (pProto->BagFamily & BAG_FAMILY_MASK_KEYS)
1688 {
1689 uint32 keyringSize = GetMaxKeyringSize();
1690 for (uint32 t = KEYRING_SLOT_START; t < KEYRING_SLOT_START + keyringSize; ++t)
1691 {
1692 if (inv_keys[t - KEYRING_SLOT_START] == 0)
1693 {
1694 inv_keys[t - KEYRING_SLOT_START] = 1;
1695 b_found = true;
1696 break;
1697 }
1698 }
1699 }
1700
1701 if (b_found)
1702 continue;
1703
1704 if (pProto->IsCurrencyToken())
1705 {
1707 {
1708 if (inv_tokens[t - CURRENCYTOKEN_SLOT_START] == 0)
1709 {
1710 inv_tokens[t - CURRENCYTOKEN_SLOT_START] = 1;
1711 b_found = true;
1712 break;
1713 }
1714 }
1715 }
1716
1717 if (b_found)
1718 continue;
1719
1720 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1721 {
1722 if (Bag* bag = GetBagByPos(t))
1723 {
1724 pBagProto = bag->GetTemplate();
1725
1726 // not plain container check
1727 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER) &&
1728 ItemCanGoIntoBag(pProto, pBagProto))
1729 {
1730 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1731 {
1732 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1733 {
1734 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1735 b_found = true;
1736 break;
1737 }
1738 }
1739 }
1740 }
1741 }
1742 if (b_found)
1743 continue;
1744 }
1745
1746 // search free slot
1747 bool b_found = false;
1749 {
1750 if (inv_slot_items[t - INVENTORY_SLOT_ITEM_START] == 0)
1751 {
1752 inv_slot_items[t - INVENTORY_SLOT_ITEM_START] = 1;
1753 b_found = true;
1754 break;
1755 }
1756 }
1757 if (b_found)
1758 continue;
1759
1760 // search free slot in bags
1761 for (int t = INVENTORY_SLOT_BAG_START; !b_found && t < INVENTORY_SLOT_BAG_END; ++t)
1762 {
1763 if (Bag* bag = GetBagByPos(t))
1764 {
1765 pBagProto = bag->GetTemplate();
1766
1767 // special bag already checked
1768 if (pBagProto && (pBagProto->Class != ITEM_CLASS_CONTAINER || pBagProto->SubClass != ITEM_SUBCLASS_CONTAINER))
1769 continue;
1770
1771 for (uint32 j = 0; j < bag->GetBagSize(); j++)
1772 {
1773 if (inv_bags[t - INVENTORY_SLOT_BAG_START][j] == 0)
1774 {
1775 inv_bags[t - INVENTORY_SLOT_BAG_START][j] = 1;
1776 b_found = true;
1777 break;
1778 }
1779 }
1780 }
1781 }
1782
1783 // no free slot found?
1784 if (!b_found)
1786 }
1787
1788 return EQUIP_ERR_OK;
1789}
@ KEYRING_SLOT_END
Definition Player.h:726
bool IsInTrade() const
Definition Item.h:260

References BAG_FAMILY_MASK_KEYS, ItemTemplate::BagFamily, Item::CanBeMergedPartlyWith(), CanTakeMoreSimilarItems(), ItemTemplate::Class, CURRENCYTOKEN_SLOT_END, CURRENCYTOKEN_SLOT_START, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_INVENTORY_FULL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, GetBagByPos(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetLootGUID(), GetMaxKeyringSize(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Item::IsBindedNotWith(), ItemTemplate::IsCurrencyToken(), Item::IsInTrade(), ITEM_CLASS_CONTAINER, ITEM_SUBCLASS_CONTAINER, ItemCanGoIntoBag(), KEYRING_SLOT_END, KEYRING_SLOT_START, LOG_DEBUG, MAX_BAG_SIZE, ItemTemplate::Stackable, and ItemTemplate::SubClass.

Referenced by WorldSession::HandleAcceptTradeOpcode().

◆ CanStoreNewItem()

◆ CanTakeMoreSimilarItems() [1/3]

InventoryResult Player::CanTakeMoreSimilarItems ( Item pItem) const
inline

◆ CanTakeMoreSimilarItems() [2/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count 
) const
inline
1279{ return CanTakeMoreSimilarItems(entry, count, nullptr); }

References CanTakeMoreSimilarItems().

Referenced by CanTakeMoreSimilarItems().

◆ CanTakeMoreSimilarItems() [3/3]

InventoryResult Player::CanTakeMoreSimilarItems ( uint32  entry,
uint32  count,
Item pItem,
uint32 no_space_count = nullptr 
) const
802{
803 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(entry);
804 if (!pProto)
805 {
806 if (no_space_count)
807 *no_space_count = count;
809 }
810
811 // no maximum
812 if ((pProto->MaxCount <= 0 && pProto->ItemLimitCategory == 0) || pProto->MaxCount == 2147483647)
813 return EQUIP_ERR_OK;
814
815 if (pProto->MaxCount > 0)
816 {
817 uint32 curcount = GetItemCount(pProto->ItemId, true, pItem);
818 if (curcount + count > uint32(pProto->MaxCount))
819 {
820 if (no_space_count)
821 *no_space_count = count + curcount - pProto->MaxCount;
823 }
824 }
825
826 // check unique-equipped limit
827 if (pProto->ItemLimitCategory)
828 {
829 ItemLimitCategoryEntry const* limitEntry = sItemLimitCategoryStore.LookupEntry(pProto->ItemLimitCategory);
830 if (!limitEntry)
831 {
832 if (no_space_count)
833 *no_space_count = count;
835 }
836
837 if (limitEntry->mode == ITEM_LIMIT_CATEGORY_MODE_HAVE)
838 {
839 uint32 curcount = GetItemCountWithLimitCategory(pProto->ItemLimitCategory, pItem);
840 if (curcount + count > uint32(limitEntry->maxCount))
841 {
842 if (no_space_count)
843 *no_space_count = count + curcount - limitEntry->maxCount;
845 }
846 }
847 }
848
849 return EQUIP_ERR_OK;
850}
@ ITEM_LIMIT_CATEGORY_MODE_HAVE
Definition DBCEnums.h:379
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
Definition Item.h:130
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item *skipItem=nullptr) const
Definition PlayerStorage.cpp:373
uint32 mode
Definition DBCStructure.h:1202

References EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_OK, GetItemCount(), GetItemCountWithLimitCategory(), ITEM_LIMIT_CATEGORY_MODE_HAVE, ItemTemplate::ItemId, ItemTemplate::ItemLimitCategory, ItemTemplate::MaxCount, ItemLimitCategoryEntry::maxCount, ItemLimitCategoryEntry::mode, sItemLimitCategoryStore, and sObjectMgr.

◆ CanTakeQuest()

bool Player::CanTakeQuest ( Quest const *  quest,
bool  msg 
)
252{
253 return !sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, quest->GetQuestId(), this)
254 && SatisfyQuestStatus(quest, msg) && SatisfyQuestExclusiveGroup(quest, msg)
255 && SatisfyQuestClass(quest, msg) && SatisfyQuestRace(quest, msg) && SatisfyQuestLevel(quest, msg)
256 && SatisfyQuestSkill(quest, msg) && SatisfyQuestReputation(quest, msg)
257 && SatisfyQuestPreviousQuest(quest, msg) && SatisfyQuestTimed(quest, msg)
258 && SatisfyQuestNextChain(quest, msg) && SatisfyQuestPrevChain(quest, msg)
259 && SatisfyQuestDay(quest, msg) && SatisfyQuestWeek(quest, msg)
260 && SatisfyQuestMonth(quest, msg) && SatisfyQuestSeasonal(quest, msg)
261 && SatisfyQuestConditions(quest, msg);
262}
bool SatisfyQuestConditions(Quest const *qInfo, bool msg)
Definition PlayerQuest.cpp:1159
bool SatisfyQuestTimed(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1172
bool SatisfyQuestLevel(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:967
bool SatisfyQuestStatus(Quest const *qInfo, bool msg) const
Definition PlayerQuest.cpp:1148

References DISABLE_TYPE_QUEST, Quest::GetQuestId(), SatisfyQuestClass(), SatisfyQuestConditions(), SatisfyQuestDay(), SatisfyQuestExclusiveGroup(), SatisfyQuestLevel(), SatisfyQuestMonth(), SatisfyQuestNextChain(), SatisfyQuestPrevChain(), SatisfyQuestPreviousQuest(), SatisfyQuestRace(), SatisfyQuestReputation(), SatisfyQuestSeasonal(), SatisfyQuestSkill(), SatisfyQuestStatus(), SatisfyQuestTimed(), SatisfyQuestWeek(), and sDisableMgr.

Referenced by CanCompleteQuest(), CanCompleteRepeatableQuest(), Spell::EffectQuestComplete(), Spell::EffectQuestStart(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverQueryQuestOpcode(), npc_wg_quest_giver::OnGossipHello(), PrepareQuestMenu(), SendPreparedQuest(), and npc_costumed_orphan_matron::sGossipHello().

◆ CanTameExoticPets()

bool Player::CanTameExoticPets ( ) const
inline

◆ CanTeleport()

bool Player::CanTeleport ( )
inline
2501{ return m_canTeleport; }

References m_canTeleport.

◆ CanTitanGrip()

bool Player::CanTitanGrip ( ) const
inline

◆ CanUnequipItem()

InventoryResult Player::CanUnequipItem ( uint16  src,
bool  swap 
) const
1991{
1992 if (!sScriptMgr->OnPlayerCanUnequipItem(const_cast<Player*>(this), pos, swap))
1994
1995 // Applied only to equipped items and bank bags
1996 if (!IsEquipmentPos(pos) && !IsBagPos(pos))
1997 return EQUIP_ERR_OK;
1998
1999 Item* pItem = GetItemByPos(pos);
2000
2001 // Applied only to existed equipped item
2002 if (!pItem)
2003 return EQUIP_ERR_OK;
2004
2005 LOG_DEBUG("entities.player.items", "STORAGE: CanUnequipItem slot = {}, item = {}, count = {}", pos, pItem->GetEntry(), pItem->GetCount());
2006
2007 ItemTemplate const* pProto = pItem->GetTemplate();
2008 if (!pProto)
2010
2011 // item used
2012 if (pItem->m_lootGenerated)
2014
2015 // do not allow unequipping gear except weapons, offhands, projectiles, relics in
2016 // - combat
2017 // - in-progress arenas
2018 if (!pProto->CanChangeEquipStateInCombat())
2019 {
2020 if (IsInCombat())
2022
2023 if (Battleground* bg = GetBattleground())
2024 if (bg->isArena() && bg->GetStatus() == STATUS_IN_PROGRESS)
2026 }
2027
2028 // Xinef: dont allow to unequip items on disarmed slot
2031
2032 if (!swap && pItem->IsNotEmptyBag())
2034
2035 return EQUIP_ERR_OK;
2036}

References ItemTemplate::CanChangeEquipStateInCombat(), Unit::CanUseAttackType(), EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NOT_DURING_ARENA_MATCH, EQUIP_ERR_NOT_IN_COMBAT, EQUIP_ERR_NOT_WHILE_DISARMED, EQUIP_ERR_OK, GetAttackBySlot(), GetBattleground(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), Item::GetSlot(), Item::GetTemplate(), IsBagPos(), IsEquipmentPos(), Unit::IsInCombat(), Item::IsNotEmptyBag(), LOG_DEBUG, Item::m_lootGenerated, sScriptMgr, and STATUS_IN_PROGRESS.

Referenced by CanEquipItem(), CanUnequipItems(), DestroyItemCount(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), and SwapItem().

◆ CanUnequipItems()

InventoryResult Player::CanUnequipItems ( uint32  item,
uint32  count 
) const
275{
276 uint32 tempcount = 0;
277
279
281 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
282 if (pItem->GetEntry() == item)
283 {
285 if (ires == EQUIP_ERR_OK)
286 {
287 tempcount += pItem->GetCount();
288 if (tempcount >= count)
289 return EQUIP_ERR_OK;
290 }
291 else
292 res = ires;
293 }
294
296 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
297 if (pItem->GetEntry() == item)
298 {
299 tempcount += pItem->GetCount();
300 if (tempcount >= count)
301 return EQUIP_ERR_OK;
302 }
303
305 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
306 if (pItem->GetEntry() == item)
307 {
308 tempcount += pItem->GetCount();
309 if (tempcount >= count)
310 return EQUIP_ERR_OK;
311 }
312
314 if (Bag* pBag = GetBagByPos(i))
315 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
316 if (Item* pItem = GetItemByPos(i, j))
317 if (pItem->GetEntry() == item)
318 {
319 tempcount += pItem->GetCount();
320 if (tempcount >= count)
321 return EQUIP_ERR_OK;
322 }
323
324 // not found req. item count and have unequippable items
325 return res;
326}
@ EQUIPMENT_SLOT_START
Definition Player.h:669

References CanUnequipItem(), CURRENCYTOKEN_SLOT_END, EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by TakeQuestSourceItem().

◆ CanUninviteFromGroup()

PartyResult Player::CanUninviteFromGroup ( ObjectGuid  targetPlayerGUID = ObjectGuid::Empty) const
Todo:
: Should also be sent when anyone has recently left combat, with an aprox ~5 seconds timer.
13058{
13059 Group const* grp = GetGroup();
13060 if (!grp)
13061 return ERR_NOT_IN_GROUP;
13062
13063 if (grp->isLFGGroup(true))
13064 {
13065 ObjectGuid gguid = grp->GetGUID();
13066 if (!sLFGMgr->GetKicksLeft(gguid))
13068
13069 lfg::LfgState state = sLFGMgr->GetState(gguid);
13070 if (state == lfg::LFG_STATE_BOOT)
13072
13075
13078
13079 if (grp->isRollLootActive())
13081
13083 for (GroupReference const* itr = grp->GetFirstMember(); itr != nullptr; itr = itr->next())
13084 if (itr->GetSource() && itr->GetSource()->IsInMap(this) && itr->GetSource()->IsInCombat())
13086
13087 if (Player* target = ObjectAccessor::FindConnectedPlayer(targetPlayerGUID))
13088 {
13089 if (Aura* dungeonCooldownAura = target->GetAura(lfg::LFG_SPELL_DUNGEON_COOLDOWN))
13090 {
13091 int32 elapsedTime = dungeonCooldownAura->GetMaxDuration() - dungeonCooldownAura->GetDuration();
13092 if (static_cast<int32>(sWorld->getIntConfig(CONFIG_LFG_KICK_PREVENTION_TIMER)) > elapsedTime)
13093 {
13095 }
13096 }
13097 }
13098
13099 /* Missing support for these types
13100 return ERR_PARTY_LFG_BOOT_COOLDOWN_S;
13101 */
13102 }
13103 else
13104 {
13105 if (!grp->IsLeader(GetGUID()) && !grp->IsAssistant(GetGUID()))
13106 return ERR_NOT_LEADER;
13107
13108 if (InBattleground())
13109 return ERR_INVITE_RESTRICTED;
13110 }
13111
13112 return ERR_PARTY_RESULT_OK;
13113}
@ ERR_PARTY_LFG_BOOT_LOOT_ROLLS
Definition SharedDefines.h:3998
@ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S
Definition SharedDefines.h:3993
@ ERR_PARTY_LFG_BOOT_LIMIT
Definition SharedDefines.h:3989
@ ERR_NOT_LEADER
Definition SharedDefines.h:3978
@ ERR_NOT_IN_GROUP
Definition SharedDefines.h:3977
@ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE
Definition SharedDefines.h:3997
@ ERR_PARTY_LFG_BOOT_IN_COMBAT
Definition SharedDefines.h:3995
@ ERR_PARTY_LFG_BOOT_IN_PROGRESS
Definition SharedDefines.h:3991
@ ERR_INVITE_RESTRICTED
Definition SharedDefines.h:3982
@ ERR_PARTY_RESULT_OK
Definition SharedDefines.h:3971
@ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS
Definition SharedDefines.h:3992
@ CONFIG_LFG_KICK_PREVENTION_TIMER
Definition WorldConfig.h:376
Definition GroupReference.h:27
bool isLFGGroup(bool restricted=false) const
Definition Group.cpp:2275
bool IsAssistant(ObjectGuid guid) const
Definition Group.cpp:2365
bool isRollLootActive() const
Definition Group.cpp:2468
bool IsLeader(ObjectGuid guid) const
Definition Group.cpp:2351
ObjectGuid GetGUID() const
Definition Group.cpp:2316
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
bool InBattleground() const
Definition Player.h:2256
Player * FindConnectedPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:257
LfgState
Definition LFG.h:67
@ LFG_STATE_FINISHED_DUNGEON
Definition LFG.h:74
@ LFG_STATE_BOOT
Definition LFG.h:72
@ LFG_SPELL_DUNGEON_COOLDOWN
Definition LFGMgr.h:52
@ LFG_GROUP_KICK_VOTES_NEEDED
Definition LFGMgr.h:55

References CONFIG_LFG_KICK_PREVENTION_TIMER, ERR_INVITE_RESTRICTED, ERR_NOT_IN_GROUP, ERR_NOT_LEADER, ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE, ERR_PARTY_LFG_BOOT_IN_COMBAT, ERR_PARTY_LFG_BOOT_IN_PROGRESS, ERR_PARTY_LFG_BOOT_LIMIT, ERR_PARTY_LFG_BOOT_LOOT_ROLLS, ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S, ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS, ERR_PARTY_RESULT_OK, ObjectAccessor::FindConnectedPlayer(), Group::GetFirstMember(), GetGroup(), Object::GetGUID(), Group::GetGUID(), Group::GetMembersCount(), InBattleground(), Group::IsAssistant(), Group::IsLeader(), Group::isLFGGroup(), Group::isRollLootActive(), lfg::LFG_GROUP_KICK_VOTES_NEEDED, lfg::LFG_SPELL_DUNGEON_COOLDOWN, lfg::LFG_STATE_BOOT, lfg::LFG_STATE_FINISHED_DUNGEON, sLFGMgr, and sWorld.

Referenced by WorldSession::HandleGroupUninviteGuidOpcode(), and WorldSession::HandleGroupUninviteOpcode().

◆ CanUseAmmo()

InventoryResult Player::CanUseAmmo ( uint32  item) const
2469{
2470 LOG_DEBUG("entities.player.items", "STORAGE: CanUseAmmo item = {}", item);
2471 if (!IsAlive())
2473 //if (isStunned())
2474 // return EQUIP_ERR_YOU_ARE_STUNNED;
2475 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
2476 if (pProto)
2477 {
2478 if (pProto->InventoryType != INVTYPE_AMMO)
2480
2481 InventoryResult res = CanUseItem(pProto);
2482 if (res != EQUIP_ERR_OK)
2483 return res;
2484
2485 /*if (GetReputationMgr().GetReputation() < pProto->RequiredReputation)
2486 return EQUIP_ERR_CANT_EQUIP_REPUTATION;
2487 */
2488
2489 // Requires No Ammo
2490 if (HasAura(46699))
2491 return EQUIP_ERR_BAG_FULL6;
2492
2493 return EQUIP_ERR_OK;
2494 }
2496}
@ INVTYPE_AMMO
Definition ItemTemplate.h:280
@ EQUIP_ERR_YOU_ARE_DEAD
Definition Item.h:85
@ EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE
Definition Item.h:54
@ EQUIP_ERR_BAG_FULL6
Definition Item.h:109

References CanUseItem(), EQUIP_ERR_BAG_FULL6, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_ONLY_AMMO_CAN_GO_HERE, EQUIP_ERR_YOU_ARE_DEAD, Unit::HasAura(), ItemTemplate::InventoryType, INVTYPE_AMMO, Unit::IsAlive(), LOG_DEBUG, and sObjectMgr.

Referenced by Create(), and SetAmmo().

◆ CanUseBattlegroundObject()

bool Player::CanUseBattlegroundObject ( GameObject gameobject) const
Bug:
sometimes when player clicks on flag in AB - client won't send gameobject_use, only gameobject_report_use packet Note: Mount, stealth and invisibility will be removed when used
13267{
13268 // It is possible to call this method will a nullptr pointer, only skipping faction check.
13269 if (gameobject)
13270 {
13271 FactionTemplateEntry const* playerFaction = GetFactionTemplateEntry();
13272 FactionTemplateEntry const* faction = sFactionTemplateStore.LookupEntry(gameobject->GetUInt32Value(GAMEOBJECT_FACTION));
13273
13274 if (playerFaction && faction && !playerFaction->IsFriendlyTo(*faction))
13275 return false;
13276 }
13277
13283 return (!isTotalImmune() && // Damage immune
13284 !HasAura(SPELL_RECENTLY_DROPPED_FLAG) && // Still has recently held flag debuff
13285 IsAlive()); // Alive
13286}
@ SPELL_RECENTLY_DROPPED_FLAG
Definition Battleground.h:135
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
@ GAMEOBJECT_FACTION
Definition UpdateFields.h:402
bool isTotalImmune() const
Definition Player.cpp:13358
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10085
Definition DBCStructure.h:939
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

References GAMEOBJECT_FACTION, Unit::GetFactionTemplateEntry(), Object::GetUInt32Value(), Unit::HasAura(), Unit::IsAlive(), FactionTemplateEntry::IsFriendlyTo(), isTotalImmune(), sFactionTemplateStore, and SPELL_RECENTLY_DROPPED_FLAG.

Referenced by Spell::CheckCast(), and GameObject::Use().

◆ CanUseItem() [1/2]

InventoryResult Player::CanUseItem ( Item pItem,
bool  not_loading = true 
) const
Todo:
: when you right-click already equipped item it throws EQUIP_ERR_NO_REQUIRED_PROFICIENCY.
2226{
2227 if (pItem)
2228 {
2229 LOG_DEBUG("entities.player.items", "STORAGE: CanUseItem item = {}", pItem->GetEntry());
2230
2231 if (!IsAlive() && not_loading)
2233
2234 //if (isStunned())
2235 // return EQUIP_ERR_YOU_ARE_STUNNED;
2236
2237 ItemTemplate const* pProto = pItem->GetTemplate();
2238 if (pProto)
2239 {
2240 if (pItem->IsBindedNotWith(this))
2242
2243 InventoryResult res = CanUseItem(pProto);
2244 if (res != EQUIP_ERR_OK)
2245 return res;
2246
2247 if (pItem->GetSkill() != 0)
2248 {
2249 bool allowEquip = false;
2250 uint32 itemSkill = pItem->GetSkill();
2251 // Armor that is binded to account can "morph" from plate to mail, etc. if skill is not learned yet.
2252 if (pProto->Quality == ITEM_QUALITY_HEIRLOOM && pProto->Class == ITEM_CLASS_ARMOR && !HasSkill(itemSkill))
2253 {
2255
2256 // In fact it's a visual bug, everything works properly... I need sniffs of operations with
2257 // binded to account items from off server.
2258
2260 {
2261 allowEquip = (itemSkill == SKILL_PLATE_MAIL);
2262 }
2264 {
2265 allowEquip = (itemSkill == SKILL_MAIL);
2266 }
2267 }
2268 if (!allowEquip && GetSkillValue(itemSkill) == 0)
2270 }
2271
2274
2275 return EQUIP_ERR_OK;
2276 }
2277 }
2279}
@ EQUIP_ERR_CANT_EQUIP_REPUTATION
Definition Item.h:111
@ ITEM_QUALITY_HEIRLOOM
Definition SharedDefines.h:347
@ SKILL_PLATE_MAIL
Definition SharedDefines.h:3201
@ SKILL_MAIL
Definition SharedDefines.h:3212
uint32 GetSkill()
Definition Item.cpp:555
uint32 Quality
Definition ItemTemplate.h:626

References CanUseItem(), ItemTemplate::Class, CLASS_CONTEXT_EQUIP_ARMOR_CLASS, CLASS_HUNTER, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARRIOR, EQUIP_ERR_CANT_EQUIP_REPUTATION, EQUIP_ERR_DONT_OWN_THAT_ITEM, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, Object::GetEntry(), GetReputationRank(), Item::GetSkill(), GetSkillValue(), Item::GetTemplate(), HasSkill(), Unit::IsAlive(), Item::IsBindedNotWith(), IsClass(), ITEM_CLASS_ARMOR, ITEM_QUALITY_HEIRLOOM, LOG_DEBUG, ItemTemplate::Quality, ItemTemplate::RequiredReputationFaction, ItemTemplate::RequiredReputationRank, SKILL_MAIL, and SKILL_PLATE_MAIL.

Referenced by CanBankItem(), CanEquipItem(), CanUseAmmo(), CanUseItem(), WorldSession::HandleReadItem(), and WorldSession::HandleUseItemOpcode().

◆ CanUseItem() [2/2]

InventoryResult Player::CanUseItem ( ItemTemplate const *  pItem) const
2282{
2283 // Used by group, function NeedBeforeGreed, to know if a prototype can be used by a player
2284
2285 if (!proto)
2286 {
2288 }
2289
2290 if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE) && GetTeamId(true) != TEAM_HORDE)
2291 {
2293 }
2294
2295 if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE) && GetTeamId(true) != TEAM_ALLIANCE)
2296 {
2298 }
2299
2300 if ((proto->AllowableClass & getClassMask()) == 0 || (proto->AllowableRace & getRaceMask()) == 0)
2301 {
2303 }
2304
2305 if (proto->RequiredSkill != 0)
2306 {
2307 if (GetSkillValue(proto->RequiredSkill) == 0)
2308 {
2310 }
2311 else if (GetSkillValue(proto->RequiredSkill) < proto->RequiredSkillRank)
2312 {
2314 }
2315 }
2316
2317 if (proto->RequiredSpell != 0 && !HasSpell(proto->RequiredSpell))
2318 {
2320 }
2321
2322 if (GetLevel() < proto->RequiredLevel)
2323 {
2325 }
2326
2327 // If World Event is not active, prevent using event dependant items
2328 if (proto->HolidayId && !IsHolidayActive((HolidayIds)proto->HolidayId))
2329 {
2331 }
2332
2334
2335 if (!sScriptMgr->OnPlayerCanUseItem(const_cast<Player*>(this), proto, result))
2336 {
2337 return result;
2338 }
2339
2340 return EQUIP_ERR_OK;
2341}
bool IsHolidayActive(HolidayIds id)
Definition GameEventMgr.cpp:1950
@ EQUIP_ERR_CANT_EQUIP_LEVEL_I
Definition Item.h:48
HolidayIds
Definition SharedDefines.h:2991

References ItemTemplate::AllowableClass, ItemTemplate::AllowableRace, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_CANT_EQUIP_SKILL, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_NO_REQUIRED_PROFICIENCY, EQUIP_ERR_OK, EQUIP_ERR_YOU_CAN_NEVER_USE_THAT_ITEM, Unit::getClassMask(), Unit::GetLevel(), Unit::getRaceMask(), GetSkillValue(), GetTeamId(), ItemTemplate::HasFlag2(), HasSpell(), ItemTemplate::HolidayId, IsHolidayActive(), ITEM_FLAG2_FACTION_ALLIANCE, ITEM_FLAG2_FACTION_HORDE, ItemTemplate::RequiredLevel, ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, ItemTemplate::RequiredSpell, sScriptMgr, TEAM_ALLIANCE, and TEAM_HORDE.

◆ CastAllObtainSpells()

void Player::CastAllObtainSpells ( )
7014{
7015 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
7016 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
7017 ApplyItemObtainSpells(item, true);
7018
7020 {
7021 Bag* bag = GetBagByPos(i);
7022 if (!bag)
7023 continue;
7024
7025 for (uint32 slot = 0; slot < bag->GetBagSize(); ++slot)
7026 if (Item* item = bag->GetItemByPos(slot))
7027 ApplyItemObtainSpells(item, true);
7028 }
7029}
Item * GetItemByPos(uint8 slot) const
Definition Bag.cpp:235
void ApplyItemObtainSpells(Item *item, bool apply)
Definition Player.cpp:7031

References ApplyItemObtainSpells(), GetBagByPos(), Bag::GetBagSize(), GetItemByPos(), Bag::GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by ResurrectPlayer().

◆ CastItemCombatSpell() [1/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx 
)
7255{
7256 if (!target || !target->IsAlive() || target == this)
7257 return;
7258
7259 // Xinef: do not use disarmed weapons, special exception - shaman ghost wolf form
7260 // Xinef: normal forms proc on hit enchants / built in item bonuses
7262 return;
7263
7265 {
7266 // If usable, try to cast item spell
7267 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
7268 if (!item->IsBroken())
7269 if (ItemTemplate const* proto = item->GetTemplate())
7270 {
7271 // Additional check for weapons
7272 if (proto->Class == ITEM_CLASS_WEAPON)
7273 {
7274 // offhand item cannot proc from main hand hit etc
7275 EquipmentSlots slot;
7276 switch (attType)
7277 {
7278 case BASE_ATTACK:
7280 break;
7281 case OFF_ATTACK:
7283 break;
7284 case RANGED_ATTACK:
7285 slot = EQUIPMENT_SLOT_RANGED;
7286 break;
7287 default:
7288 slot = EQUIPMENT_SLOT_END;
7289 break;
7290 }
7291 if (slot != i)
7292 continue;
7293 }
7294
7295 CastItemCombatSpell(target, attType, procVictim, procEx, item, proto);
7296 }
7297 }
7298}
EquipmentSlots
Definition Player.h:668
@ FORM_GHOSTWOLF
Definition UnitDefines.h:85
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7254

References BASE_ATTACK, Unit::CanUseAttackType(), CastItemCombatSpell(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, FORM_GHOSTWOLF, GetItemByPos(), Unit::GetShapeshiftForm(), INVENTORY_SLOT_BAG_0, Unit::IsAlive(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by CastItemCombatSpell(), Unit::DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ CastItemCombatSpell() [2/2]

void Player::CastItemCombatSpell ( Unit target,
WeaponAttackType  attType,
uint32  procVictim,
uint32  procEx,
Item item,
ItemTemplate const *  proto 
)
7301{
7302 if (!sScriptMgr->OnPlayerCanCastItemCombatSpell(this, target, attType, procVictim, procEx, item, proto))
7303 return;
7304
7305 // Can do effect if any damage done to target
7306 if (procVictim & PROC_FLAG_TAKEN_DAMAGE)
7307 //if (damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE)
7308 {
7309 for (uint8 i = 0; i < MAX_ITEM_SPELLS; ++i)
7310 {
7311 _Spell const& spellData = proto->Spells[i];
7312
7313 // no spell
7314 if (!spellData.SpellId)
7315 continue;
7316
7317 // wrong triggering type
7319 continue;
7320
7321 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7322 if (!spellInfo)
7323 {
7324 LOG_ERROR("entities.player", "WORLD: unknown Item spellid {}", spellData.SpellId);
7325 continue;
7326 }
7327
7328 float chance = (float)spellInfo->ProcChance;
7329
7330 if (spellData.SpellPPMRate)
7331 {
7332 uint32 WeaponSpeed = GetAttackTime(attType);
7333 chance = GetPPMProcChance(WeaponSpeed, spellData.SpellPPMRate, spellInfo);
7334 }
7335 else if (chance > 100.0f)
7336 {
7337 chance = GetWeaponProcChance();
7338 }
7339
7340 if (roll_chance_f(chance) && sScriptMgr->OnCastItemCombatSpell(this, target, spellInfo, item))
7342 }
7343 }
7344
7345 // item combat enchantments
7346 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7347 {
7348 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7349 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7350 if (!pEnchant)
7351 continue;
7352
7353 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7354 {
7355 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL)
7356 continue;
7357
7358 SpellEnchantProcEntry const* entry = sSpellMgr->GetSpellEnchantProcEvent(enchant_id);
7359
7360 if (entry && entry->procEx)
7361 {
7362 // Check hit/crit/dodge/parry requirement
7363 if ((entry->procEx & procEx) == 0)
7364 continue;
7365 }
7366 else
7367 {
7368 // Can do effect if any damage done to target
7369 if (!(procVictim & PROC_FLAG_TAKEN_DAMAGE))
7370 //if (!(damageInfo->procVictim & PROC_FLAG_TAKEN_ANY_DAMAGE))
7371 continue;
7372 }
7373
7374 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_WHITE_HIT) && (procVictim & SPELL_PROC_FLAG_MASK))
7375 continue;
7376
7377 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7378 if (!spellInfo)
7379 {
7380 LOG_ERROR("entities.player", "Player::CastItemCombatSpell({}, name: {}, enchant: {}): unknown spell {} is casted, ignoring...",
7381 GetGUID().ToString(), GetName(), pEnchant->ID, pEnchant->spellid[s]);
7382 continue;
7383 }
7384
7385 if (entry && (entry->attributeMask & ENCHANT_PROC_ATTR_EXCLUSIVE) != 0)
7386 {
7387 Unit* checkTarget = spellInfo->IsPositive() ? this : target;
7388 if (checkTarget->HasAura(spellInfo->Id, GetGUID()))
7389 {
7390 continue;
7391 }
7392 }
7393
7394 float chance = pEnchant->amount[s] != 0 ? float(pEnchant->amount[s]) : GetWeaponProcChance();
7395
7396 if (entry)
7397 {
7398 if (entry->PPMChance)
7399 chance = GetPPMProcChance(proto->Delay, entry->PPMChance, spellInfo);
7400 else if (entry->customChance)
7401 chance = (float)entry->customChance;
7402 }
7403
7404 // Apply spell mods
7405 ApplySpellMod(pEnchant->spellid[s], SPELLMOD_CHANCE_OF_SUCCESS, chance);
7406
7407 // Shiv has 100% chance to apply the poison
7408 if (FindCurrentSpellBySpellId(5938) && e_slot == TEMP_ENCHANTMENT_SLOT)
7409 chance = 100.0f;
7410
7411 if (roll_chance_f(chance))
7412 {
7413 // Xinef: implement enchant charges
7414 if (uint32 charges = item->GetEnchantmentCharges(EnchantmentSlot(e_slot)))
7415 {
7416 if (!--charges)
7417 {
7418 ApplyEnchantment(item, EnchantmentSlot(e_slot), false);
7419 item->ClearEnchantment(EnchantmentSlot(e_slot));
7420 }
7421 else
7422 item->SetEnchantmentCharges(EnchantmentSlot(e_slot), charges);
7423 }
7424
7425 Unit* unitTarget = spellInfo->IsPositive() ? this : target;
7427 }
7428 }
7429 }
7430}
@ ITEM_SPELLTRIGGER_CHANCE_ON_HIT
Definition ItemTemplate.h:79
bool roll_chance_f(float chance)
Definition Random.h:57
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore GCD.
Definition SpellDefines.h:135
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:137
@ SPELL_PROC_FLAG_MASK
Definition SpellMgr.h:156
@ ENCHANT_PROC_ATTR_WHITE_HIT
Definition SpellMgr.h:310
@ ENCHANT_PROC_ATTR_EXCLUSIVE
Definition SpellMgr.h:309
void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
Definition Item.cpp:951
void ClearEnchantment(EnchantmentSlot slot)
Definition Item.cpp:960
uint32 GetEnchantmentCharges(EnchantmentSlot slot) const
Definition Item.h:306
bool IsPositive() const
Definition SpellInfo.cpp:1237
uint32 ProcChance
Definition SpellInfo.h:356
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13530
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4212
float GetWeaponProcChance() const
Definition Unit.cpp:13519
Definition SpellMgr.h:314
uint32 procEx
Definition SpellMgr.h:317
uint32 attributeMask
Definition SpellMgr.h:318
uint32 customChance
Definition SpellMgr.h:315
float PPMChance
Definition SpellMgr.h:316
uint32 ID
Definition DBCStructure.h:1843
float SpellPPMRate
Definition ItemTemplate.h:594

References SpellItemEnchantmentEntry::amount, ApplyEnchantment(), ApplySpellMod(), SpellEnchantProcEntry::attributeMask, Unit::CastSpell(), Item::ClearEnchantment(), SpellEnchantProcEntry::customChance, ItemTemplate::Delay, ENCHANT_PROC_ATTR_EXCLUSIVE, ENCHANT_PROC_ATTR_WHITE_HIT, Unit::FindCurrentSpellBySpellId(), Unit::GetAttackTime(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Object::GetGUID(), WorldObject::GetName(), Unit::GetPPMProcChance(), Unit::GetWeaponProcChance(), Unit::HasAura(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, SpellInfo::IsPositive(), ITEM_ENCHANTMENT_TYPE_COMBAT_SPELL, ITEM_SPELLTRIGGER_CHANCE_ON_HIT, LOG_ERROR, MAX_ENCHANTMENT_SLOT, MAX_ITEM_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, SpellEnchantProcEntry::PPMChance, PROC_FLAG_TAKEN_DAMAGE, SpellInfo::ProcChance, SpellEnchantProcEntry::procEx, roll_chance_f(), Item::SetEnchantmentCharges(), SPELL_PROC_FLAG_MASK, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, SPELLMOD_CHANCE_OF_SUCCESS, _Spell::SpellPPMRate, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Position::ToString(), TRIGGERED_FULL_MASK, TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD, and SpellItemEnchantmentEntry::type.

◆ CastItemUseSpell()

void Player::CastItemUseSpell ( Item item,
SpellCastTargets const &  targets,
uint8  cast_count,
uint32  glyphIndex 
)
7433{
7434 if (!sScriptMgr->OnPlayerCanCastItemUseSpell(this, item, targets, cast_count, glyphIndex))
7435 return;
7436
7437 ItemTemplate const* proto = item->GetTemplate();
7438 // special learning case
7439 if (proto->Spells[0].SpellId == 483 || proto->Spells[0].SpellId == 55884)
7440 {
7441 uint32 learn_spell_id = proto->Spells[0].SpellId;
7442 uint32 learning_spell_id = proto->Spells[1].SpellId;
7443
7444 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learn_spell_id);
7445 if (!spellInfo)
7446 {
7447 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring ", proto->ItemId, learn_spell_id);
7448 SendEquipError(EQUIP_ERR_NONE, item, nullptr);
7449 return;
7450 }
7451
7452 Spell* spell = new Spell(this, spellInfo, TRIGGERED_NONE);
7453 spell->m_CastItem = item;
7454 spell->m_cast_count = cast_count; //set count of casts
7455 spell->SetSpellValue(SPELLVALUE_BASE_POINT0, learning_spell_id);
7456 spell->prepare(&targets);
7457 return;
7458 }
7459
7460 // use triggered flag only for items with many spell casts and for not first cast
7461 uint8 count = 0;
7462
7463 std::list<Spell*> pushSpells;
7464 // item spells casted at use
7465 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
7466 {
7467 _Spell const& spellData = proto->Spells[i];
7468
7469 // no spell
7470 if (!spellData.SpellId)
7471 continue;
7472
7473 // wrong triggering type
7474 if (spellData.SpellTrigger != ITEM_SPELLTRIGGER_ON_USE)
7475 continue;
7476
7477 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellData.SpellId);
7478 if (!spellInfo)
7479 {
7480 LOG_ERROR("entities.player", "Player::CastItemUseSpell: Item (Entry: {}) in have wrong spell id {}, ignoring", proto->ItemId, spellData.SpellId);
7481 continue;
7482 }
7483
7484 if (HasSpellCooldown(spellInfo->Id))
7485 {
7486 continue;
7487 }
7488
7489 if (!spellInfo->CheckElixirStacking(this))
7490 {
7491 Spell::SendCastResult(this, spellInfo, cast_count, SPELL_FAILED_AURA_BOUNCED);
7492 continue;
7493 }
7494
7495 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7496 spell->m_CastItem = item;
7497 spell->m_cast_count = cast_count; // set count of casts
7498 spell->m_glyphIndex = glyphIndex; // glyph index
7499 spell->InitExplicitTargets(targets);
7500
7501 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7502 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7503 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7504 SpellCastResult result = spell->CheckCast(true);
7505 if (result != SPELL_CAST_OK)
7506 {
7507 spell->SendCastResult(result);
7508 delete spell;
7509 continue;
7510 }
7511
7512 pushSpells.push_back(spell);
7513 //spell->prepare(&targets);
7514
7515 ++count;
7516 }
7517
7518 // Item enchantments spells casted at use
7519 for (uint8 e_slot = 0; e_slot < MAX_ENCHANTMENT_SLOT; ++e_slot)
7520 {
7521 uint32 enchant_id = item->GetEnchantmentId(EnchantmentSlot(e_slot));
7522 SpellItemEnchantmentEntry const* pEnchant = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
7523 if (!pEnchant)
7524 continue;
7525 for (uint8 s = 0; s < MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS; ++s)
7526 {
7527 if (pEnchant->type[s] != ITEM_ENCHANTMENT_TYPE_USE_SPELL)
7528 continue;
7529
7530 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pEnchant->spellid[s]);
7531 if (!spellInfo)
7532 {
7533 LOG_ERROR("entities.player", "Player::CastItemUseSpell Enchant {}, cast unknown spell {}", pEnchant->ID, pEnchant->spellid[s]);
7534 continue;
7535 }
7536
7537 if (HasSpellCooldown(spellInfo->Id))
7538 continue;
7539
7540 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE);
7541 spell->m_CastItem = item;
7542 spell->m_cast_count = cast_count; // set count of casts
7543 spell->m_glyphIndex = glyphIndex; // glyph index
7544 spell->InitExplicitTargets(targets);
7545
7546 // Xinef: dont allow to cast such spells, it may happen that spell possess 2 spells, one for players and one for items / gameobjects
7547 // Xinef: if first one is cast on player, it may be deleted thus resulting in crash because second spell has saved pointer to the item
7548 // Xinef: there is one problem with scripts which wont be loaded at the moment of call
7549 SpellCastResult result = spell->CheckCast(true);
7550 if (result != SPELL_CAST_OK)
7551 {
7552 spell->SendCastResult(result);
7553 delete spell;
7554 continue;
7555 }
7556
7557 pushSpells.push_back(spell);
7558 //spell->prepare(&targets);
7559
7560 ++count;
7561 }
7562 }
7563
7564 // xinef: send all spells in one go, prevents crash because container is not set
7565 for (std::list<Spell*>::const_iterator itr = pushSpells.begin(); itr != pushSpells.end(); ++itr)
7566 (*itr)->prepare(&targets);
7567}
@ EQUIP_ERR_NONE
Definition Item.h:106
SpellCastResult
Definition SharedDefines.h:959
@ SPELL_FAILED_AURA_BOUNCED
Definition SharedDefines.h:969
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113
@ TRIGGERED_NONE
Definition SpellDefines.h:133
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16360
bool CheckElixirStacking(Unit const *caster) const
Definition SpellInfo.cpp:2893
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3391
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8387
uint8 m_cast_count
Definition Spell.h:535
uint32 m_glyphIndex
Definition Spell.h:536
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5592
void InitExplicitTargets(SpellCastTargets const &targets)
Definition Spell.cpp:717
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4607
Item * m_CastItem
Definition Spell.h:532

References Spell::CheckCast(), SpellInfo::CheckElixirStacking(), EQUIP_ERR_NONE, Item::GetEnchantmentId(), Item::GetTemplate(), HasSpellCooldown(), SpellInfo::Id, SpellItemEnchantmentEntry::ID, Spell::InitExplicitTargets(), ITEM_ENCHANTMENT_TYPE_USE_SPELL, ITEM_SPELLTRIGGER_ON_USE, ItemTemplate::ItemId, LOG_ERROR, Spell::m_cast_count, Spell::m_CastItem, Spell::m_glyphIndex, MAX_ENCHANTMENT_SLOT, MAX_ITEM_PROTO_SPELLS, MAX_SPELL_ITEM_ENCHANTMENT_EFFECTS, Spell::prepare(), Spell::SendCastResult(), SendEquipError(), Spell::SetSpellValue(), SPELL_CAST_OK, SPELL_FAILED_AURA_BOUNCED, _Spell::SpellId, SpellItemEnchantmentEntry::spellid, ItemTemplate::Spells, _Spell::SpellTrigger, SPELLVALUE_BASE_POINT0, sScriptMgr, sSpellItemEnchantmentStore, sSpellMgr, TRIGGERED_FULL_MASK, TRIGGERED_NONE, and SpellItemEnchantmentEntry::type.

Referenced by WorldSession::HandleUseItemOpcode().

◆ CharmSpellInitialize()

void Player::CharmSpellInitialize ( )
9728{
9729 Unit* charm = GetFirstControlled();
9730 if (!charm)
9731 return;
9732
9733 CharmInfo* charmInfo = charm->GetCharmInfo();
9734 if (!charmInfo)
9735 {
9736 LOG_ERROR("entities.player", "Player::CharmSpellInitialize(): the player's charm ({}) has no charminfo!", charm->GetGUID().ToString());
9737 return;
9738 }
9739
9740 uint8 addlist = 0;
9741 if (!charm->IsPlayer())
9742 {
9743 //CreatureInfo const* cinfo = charm->ToCreature()->GetCreatureTemplate();
9744 //if (cinfo && cinfo->type == CREATURE_TYPE_DEMON && getClass() == CLASS_WARLOCK)
9745 {
9746 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9747 if (charmInfo->GetCharmSpell(i)->GetAction())
9748 ++addlist;
9749 }
9750 }
9751
9752 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 4 * addlist + 1);
9753 data << charm->GetGUID();
9754 data << uint16(0);
9755 data << uint32(0);
9756
9757 if (!charm->IsPlayer())
9758 data << uint8(charm->ToCreature()->GetReactState()) << uint8(charmInfo->GetCommandState()) << uint16(0);
9759 else
9760 data << uint32(0);
9761
9762 charmInfo->BuildActionBar(&data);
9763
9764 data << uint8(addlist);
9765
9766 if (addlist)
9767 {
9768 for (uint32 i = 0; i < MAX_SPELL_CHARM; ++i)
9769 {
9770 CharmSpellInfo* cspell = charmInfo->GetCharmSpell(i);
9771 if (cspell->GetAction())
9772 data << uint32(cspell->packedData);
9773 }
9774 }
9775
9776 data << uint8(0); // cooldowns count
9777
9778 SendDirectMessage(&data);
9779}
#define MAX_SPELL_CHARM
Definition CharmInfo.h:24
#define MAX_UNIT_ACTION_BAR_INDEX
Definition CharmInfo.h:29
ReactStates GetReactState() const
Definition Creature.h:100
CharmInfo * GetCharmInfo()
Definition Unit.h:1248
Unit * GetFirstControlled() const
Definition Unit.cpp:11155
@ SMSG_PET_SPELLS
Definition Opcodes.h:407
Definition CharmInfo.h:127
CharmSpellInfo * GetCharmSpell(uint8 index)
Definition CharmInfo.h:158
CommandStates GetCommandState() const
Definition CharmInfo.h:136
void BuildActionBar(WorldPacket *data)
Definition CharmInfo.cpp:285
Definition CharmInfo.h:95
uint32 packedData
Definition CharmInfo.h:98
uint32 GetAction() const
Definition CharmInfo.h:102

References CharmInfo::BuildActionBar(), UnitActionBarEntry::GetAction(), Unit::GetCharmInfo(), CharmInfo::GetCharmSpell(), CharmInfo::GetCommandState(), Unit::GetFirstControlled(), Object::GetGUID(), Creature::GetReactState(), Object::IsPlayer(), LOG_ERROR, MAX_SPELL_CHARM, MAX_UNIT_ACTION_BAR_INDEX, UnitActionBarEntry::packedData, SendDirectMessage(), SMSG_PET_SPELLS, Object::ToCreature(), and ObjectGuid::ToString().

Referenced by spell_mage_summon_water_elemental::HandleDummy(), WorldSession::HandleRequestPetInfo(), Unit::SetCharmedBy(), and Unit::SetMinion().

◆ CheckAllAchievementCriteria()

void Player::CheckAllAchievementCriteria ( )
13954{
13956}
void CheckAllAchievementCriteria()
Definition AchievementMgr.cpp:795

References AchievementMgr::CheckAllAchievementCriteria(), and m_achievementMgr.

Referenced by Create(), and WorldSession::HandlePlayerLoginFromDB().

◆ CheckAmmoCompatibility()

bool Player::CheckAmmoCompatibility ( ItemTemplate const *  ammo_proto) const
7711{
7712 if (!ammo_proto)
7713 return false;
7714
7715 // check ranged weapon
7717 if (!weapon || weapon->IsBroken())
7718 return false;
7719
7720 ItemTemplate const* weapon_proto = weapon->GetTemplate();
7721 if (!weapon_proto || weapon_proto->Class != ITEM_CLASS_WEAPON)
7722 return false;
7723
7724 // check ammo ws. weapon compatibility
7725 switch (weapon_proto->SubClass)
7726 {
7729 if (ammo_proto->SubClass != ITEM_SUBCLASS_ARROW)
7730 return false;
7731 break;
7733 if (ammo_proto->SubClass != ITEM_SUBCLASS_BULLET)
7734 return false;
7735 break;
7736 default:
7737 return false;
7738 }
7739
7740 return true;
7741}
@ ITEM_SUBCLASS_WEAPON_CROSSBOW
Definition ItemTemplate.h:362
@ ITEM_SUBCLASS_WEAPON_GUN
Definition ItemTemplate.h:347
@ ITEM_SUBCLASS_WEAPON_BOW
Definition ItemTemplate.h:346
@ ITEM_SUBCLASS_ARROW
Definition ItemTemplate.h:416
@ ITEM_SUBCLASS_BULLET
Definition ItemTemplate.h:417
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:489

References ItemTemplate::Class, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), ITEM_CLASS_WEAPON, ITEM_SUBCLASS_ARROW, ITEM_SUBCLASS_BULLET, ITEM_SUBCLASS_WEAPON_BOW, ITEM_SUBCLASS_WEAPON_CROSSBOW, ITEM_SUBCLASS_WEAPON_GUN, RANGED_ATTACK, and ItemTemplate::SubClass.

Referenced by _ApplyAmmoBonuses().

◆ CheckAreaExploreAndOutdoor()

void Player::CheckAreaExploreAndOutdoor ( )
5735{
5736 if (!IsAlive())
5737 return;
5738
5739 if (IsInFlight())
5740 return;
5741
5742 bool isOutdoor = IsOutdoors();
5743 uint32 areaId = GetAreaId();
5744 AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
5745
5746 if (sWorld->getBoolConfig(CONFIG_VMAP_INDOOR_CHECK) && _wasOutdoor != isOutdoor)
5747 {
5748 _wasOutdoor = isOutdoor;
5749
5751 SpellAttr0 attrToRecalculate = isOutdoor ? SPELL_ATTR0_ONLY_OUTDOORS : SPELL_ATTR0_ONLY_INDOORS;
5752 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5753 {
5754 Aura* aura = iter->second->GetBase();
5755 SpellInfo const* spell = aura->GetSpellInfo();
5756 if (spell->Attributes & attrToRemove)
5757 {
5758 // if passive - do not remove and just turn off all effects
5759 if (aura->IsPassive())
5760 {
5761 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, false);
5762 ++iter;
5763 continue;
5764 }
5765
5766 RemoveAura(iter);
5767 }
5768 else if ((spell->Attributes & attrToRecalculate) && aura->IsPassive())
5769 {
5770 // if passive - turn on all effects
5771 aura->HandleAllEffects(iter->second, AURA_EFFECT_HANDLE_REAL, true);
5772 ++iter;
5773 }
5774 else
5775 {
5776 ++iter;
5777 }
5778 }
5779 }
5780
5781 if (!sScriptMgr->OnPlayerCanAreaExploreAndOutdoor(this))
5782 return;
5783
5784 if (!areaId)
5785 return;
5786
5787 if (!areaEntry)
5788 {
5789 LOG_ERROR("entities.player", "Player '{}' ({}) discovered unknown area (x: {} y: {} z: {} map: {})",
5791 return;
5792 }
5793
5794 uint32 offset = areaEntry->exploreFlag / 32;
5795
5796 if (offset >= PLAYER_EXPLORED_ZONES_SIZE)
5797 {
5798 LOG_ERROR("entities.player", "Wrong area flag {} in map data for (X: {} Y: {}) point to field PLAYER_EXPLORED_ZONES_1 + {} ( {} must be < {} ).", areaEntry->flags, GetPositionX(), GetPositionY(), offset, offset, PLAYER_EXPLORED_ZONES_SIZE);
5799 return;
5800 }
5801
5802 uint32 val = (uint32)(1 << (areaEntry->exploreFlag % 32));
5803 uint32 currFields = GetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset);
5804
5805 if (!(currFields & val))
5806 {
5807 SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
5808
5810
5811 if (areaEntry->area_level > 0)
5812 {
5813 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
5814 {
5815 SendExplorationExperience(areaId, 0);
5816 }
5817 else
5818 {
5819 int32 diff = int32(GetLevel()) - areaEntry->area_level;
5820 uint32 XP = 0;
5821 if (diff < -5)
5822 {
5823 XP = uint32(sObjectMgr->GetBaseXP(GetLevel() + 5) * sWorld->getRate(RATE_XP_EXPLORE));
5824 }
5825 else if (diff > 5)
5826 {
5827 int32 exploration_percent = (100 - ((diff - 5) * 5));
5828 if (exploration_percent > 100)
5829 exploration_percent = 100;
5830 else if (exploration_percent < 0)
5831 exploration_percent = 0;
5832
5833 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * exploration_percent / 100 * sWorld->getRate(RATE_XP_EXPLORE));
5834 }
5835 else
5836 {
5837 XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE));
5838 }
5839
5840 sScriptMgr->OnPlayerGiveXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE);
5841 GiveXP(XP, nullptr);
5842 SendExplorationExperience(areaId, XP);
5843 }
5844 LOG_DEBUG("entities.player", "Player {} discovered a new area: {}", GetGUID().ToString(), areaId);
5845 }
5846 }
5847}
@ ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA
Definition DBCEnums.h:157
DBCStorage< AreaTableEntry > sAreaTableStore(AreaTableEntryfmt)
@ XPSOURCE_EXPLORE
Definition Player.h:1007
@ SPELL_ATTR0_ONLY_INDOORS
Definition SharedDefines.h:407
@ SPELL_ATTR0_ONLY_OUTDOORS
Definition SharedDefines.h:408
@ CONFIG_MAX_PLAYER_LEVEL
Definition WorldConfig.h:189
@ RATE_XP_EXPLORE
Definition WorldConfig.h:435
@ CONFIG_VMAP_INDOOR_CHECK
Definition WorldConfig.h:82
void HandleAllEffects(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuras.cpp:1241
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
bool IsPassive() const
Definition SpellAuras.cpp:1082
void SendExplorationExperience(uint32 Area, uint32 Experience)
Definition PlayerMisc.cpp:159
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition Player.cpp:2370
uint32 Attributes
Definition SpellInfo.h:324
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4844
bool IsInFlight() const
Definition Unit.h:1660
AuraApplicationMap m_appliedAuras
Definition Unit.h:2124
bool IsOutdoors() const
Definition Object.cpp:3088
Definition DBCStructure.h:519
int32 area_level
Definition DBCStructure.h:526
uint32 flags
Definition DBCStructure.h:524
uint32 exploreFlag
Definition DBCStructure.h:523

References _wasOutdoor, ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA, AreaTableEntry::area_level, SpellInfo::Attributes, AURA_EFFECT_HANDLE_REAL, CONFIG_MAX_PLAYER_LEVEL, CONFIG_VMAP_INDOOR_CHECK, AreaTableEntry::exploreFlag, AreaTableEntry::flags, WorldObject::GetAreaId(), Object::GetGUID(), Unit::GetLevel(), WorldLocation::GetMapId(), WorldObject::GetName(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Aura::GetSpellInfo(), Object::GetUInt32Value(), GiveXP(), Aura::HandleAllEffects(), Unit::IsAlive(), Unit::IsInFlight(), WorldObject::IsOutdoors(), Aura::IsPassive(), LOG_DEBUG, LOG_ERROR, Unit::m_appliedAuras, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, RATE_XP_EXPLORE, Unit::RemoveAura(), sAreaTableStore, SendExplorationExperience(), Unit::SetUInt32Value(), sObjectMgr, SPELL_ATTR0_ONLY_INDOORS, SPELL_ATTR0_ONLY_OUTDOORS, sScriptMgr, sWorld, Position::ToString(), UpdateAchievementCriteria(), and XPSOURCE_EXPLORE.

Referenced by UpdatePosition().

◆ CheckDuelDistance()

void Player::CheckDuelDistance ( time_t  currTime)
6396{
6397 if (!duel)
6398 {
6399 return;
6400 }
6401
6403 GameObject* obj = GetMap()->GetGameObject(duelFlagGUID);
6404 if (!obj)
6405 return;
6406
6407 if (!duel->OutOfBoundsTime)
6408 {
6409 if (!IsWithinDistInMap(obj, 50))
6410 {
6411 duel->OutOfBoundsTime = currTime + 10;
6412
6414 SendDirectMessage(&data);
6415 }
6416 }
6417 else
6418 {
6419 if (IsWithinDistInMap(obj, 40))
6420 {
6421 duel->OutOfBoundsTime = 0;
6422
6424 SendDirectMessage(&data);
6425 }
6426 else if (currTime >= duel->OutOfBoundsTime)
6428 }
6429}
@ DUEL_FLED
Definition SharedDefines.h:3880
@ PLAYER_DUEL_ARBITER
Definition UpdateFields.h:177
Definition GameObject.h:120
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:2362
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6436
std::unique_ptr< DuelInfo > duel
Definition Player.h:1873
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1354
@ SMSG_DUEL_INBOUNDS
Definition Opcodes.h:391
@ SMSG_DUEL_OUTOFBOUNDS
Definition Opcodes.h:390

References duel, DUEL_FLED, DuelComplete(), Map::GetGameObject(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::IsWithinDistInMap(), PLAYER_DUEL_ARBITER, SendDirectMessage(), SMSG_DUEL_INBOUNDS, and SMSG_DUEL_OUTOFBOUNDS.

Referenced by Update().

◆ CheckInstanceCount()

bool Player::CheckInstanceCount ( uint32  instanceId) const
6995{
6996 if (_instanceResetTimes.size() < sWorld->getIntConfig(CONFIG_MAX_INSTANCES_PER_HOUR))
6997 return true;
6998 return _instanceResetTimes.find(instanceId) != _instanceResetTimes.end();
6999}
@ CONFIG_MAX_INSTANCES_PER_HOUR
Definition WorldConfig.h:322

References _instanceResetTimes, CONFIG_MAX_INSTANCES_PER_HOUR, and sWorld.

Referenced by MapMgr::PlayerCannotEnter().

◆ CheckInstanceLoginValid()

bool Player::CheckInstanceLoginValid ( )
6966{
6967 if (!GetMap())
6968 return false;
6969
6970 if (!GetMap()->IsDungeon() || IsGameMaster())
6971 return true;
6972
6973 if (GetMap()->IsRaid())
6974 {
6975 // cannot be in raid instance without a group
6976 if (!GetGroup() && !sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_RAID))
6977 return false;
6978 }
6979 else
6980 {
6981 // cannot be in normal instance without a group and more players than 1 in instance
6982 if (!GetGroup() && GetMap()->GetPlayersCountExceptGMs() > 1)
6983 return false;
6984 }
6985
6986 // pussywizard: check CanEnter for GetMap(), because in PlayerCannotEnter it is called for a map decided before loading screen (can change)
6987 if (GetMap()->CannotEnter(this, true))
6988 return false;
6989
6990 // do checks for satisfy accessreqs, instance full, encounter in progress (raid), perm bind group != perm bind player
6991 return sMapMgr->PlayerCannotEnter(GetMap()->GetId(), this, true) == Map::CAN_ENTER;
6992}
#define sMapMgr
Definition MapMgr.h:220
@ CONFIG_INSTANCE_IGNORE_RAID
Definition WorldConfig.h:44
@ CAN_ENTER
Definition Map.h:271
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:236

References Map::CAN_ENTER, CONFIG_INSTANCE_IGNORE_RAID, GetGroup(), WorldObject::GetMap(), IsGameMaster(), sMapMgr, and sWorld.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ CheckSkillLearnedBySpell()

bool Player::CheckSkillLearnedBySpell ( uint32  spellId)
3097{
3099 return true;
3100
3101 SkillLineAbilityMapBounds skill_bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellId);
3102 uint32 errorSkill = 0;
3103 for (SkillLineAbilityMap::const_iterator sla = skill_bounds.first; sla != skill_bounds.second; ++sla)
3104 {
3105 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(sla->second->SkillLine);
3106 if (!pSkill)
3107 continue;
3108
3109 if (GetSkillRaceClassInfo(pSkill->id, getRace(), getClass()))
3110 return true;
3111 else
3112 errorSkill = pSkill->id;
3113 }
3114
3115 if (errorSkill)
3116 {
3117 LOG_ERROR("entities.player", "Player {} (GUID: {}), has spell ({}) that teach skill ({}) which is invalid for the race/class combination (Race: {}, Class: {}). Will be deleted.",
3118 GetName(), GetGUID().GetCounter(), spellId, errorSkill, getRace(), getClass());
3119
3120 return false;
3121 }
3122 return true;
3123}
@ CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS
Definition WorldConfig.h:486

References CONFIG_VALIDATE_SKILL_LEARNED_BY_SPELLS, Unit::getClass(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), GetSkillRaceClassInfo(), SkillLineEntry::id, LOG_ERROR, sSkillLineStore, sSpellMgr, and sWorld.

Referenced by _LoadSpells().

◆ CleanupAfterTaxiFlight()

void Player::CleanupAfterTaxiFlight ( )
10461{
10462 // For spells that trigger flying paths remove them at arrival
10464 {
10467 }
10468 m_taxi.ClearTaxiDestinations(); // not destinations, clear source node
10469 Dismount();
10472}
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:274
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
void Dismount()
Definition Unit.cpp:13604
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:940

References PlayerTaxi::ClearTaxiDestinations(), Unit::Dismount(), Unit::getHostileRefMgr(), m_flightSpellActivated, m_taxi, Unit::RemoveAurasDueToSpell(), Unit::RemoveUnitFlag(), HostileRefMgr::setOnlineOfflineState(), UNIT_FLAG_DISABLE_MOVE, and UNIT_FLAG_TAXI_FLIGHT.

Referenced by go_commandscript::DoTeleport(), misc_commandscript::HandleAppearCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), and TeleportTo().

◆ CleanupChannels()

void Player::CleanupChannels ( )
5022{
5023 while (!m_channels.empty())
5024 {
5025 Channel* ch = *m_channels.begin();
5026 m_channels.erase(m_channels.begin()); // remove from player's channel list
5027 ch->LeaveChannel(this, false); // not send to client, not remove from player's channel list
5028 }
5029}
Definition Channel.h:144
void LeaveChannel(Player *player, bool send=true)
Definition Channel.cpp:249
JoinedChannelsList m_channels
Definition Player.h:2861

References Channel::LeaveChannel(), and m_channels.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld(), and WorldSession::LogoutPlayer().

◆ CleanupsBeforeDelete()

void Player::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

475{
476 TradeCancel(false);
478
479 Unit::CleanupsBeforeDelete(finalCleanup);
480}
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3878
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition Unit.cpp:15786

References Unit::CleanupsBeforeDelete(), DUEL_INTERRUPTED, DuelComplete(), and TradeCancel().

Referenced by WorldSession::LogoutPlayer().

◆ ClearAfkReports()

void Player::ClearAfkReports ( )
inline
2288{ m_bgData.bgAfkReporter.clear(); }
GuidSet bgAfkReporter
Definition Player.h:1037

References BGData::bgAfkReporter, and m_bgData.

Referenced by Battleground::RemovePlayerAtLeave().

◆ ClearChannelWatch()

void Player::ClearChannelWatch ( )
5032{
5033 for (JoinedChannelsList::iterator itr = m_channels.begin(); itr != m_channels.end(); ++itr)
5034 (*itr)->RemoveWatching(this);
5035}

References m_channels.

Referenced by WorldSession::HandleSetChannelWatch().

◆ ClearReceivedSpectatorResetFor()

void Player::ClearReceivedSpectatorResetFor ( )
inline

◆ clearResurrectRequestData()

void Player::clearResurrectRequestData ( )
inline
1821{ setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
static ObjectGuid const Empty
Definition ObjectGuid.h:120
void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
Definition Player.h:1811

References ObjectGuid::Empty, and setResurrectRequestData().

Referenced by WorldSession::HandleResurrectResponseOpcode(), Player(), and setDeathState().

◆ ClearWhisperWhiteList()

void Player::ClearWhisperWhiteList ( )
inline
2564{ WhisperList.clear(); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ CompletedAchievement()

void Player::CompletedAchievement ( AchievementEntry const *  entry)
13989{
13991}
void CompletedAchievement(AchievementEntry const *entry)
Definition AchievementMgr.cpp:2265

References AchievementMgr::CompletedAchievement(), and m_achievementMgr.

Referenced by achievement_commandscript::HandleAchievementAddCommand(), and ArenaSeasonTeamRewarderImpl::RewardWithAchievements().

◆ CompleteQuest()

void Player::CompleteQuest ( uint32  quest_id)
599{
600 if (!quest_id)
601 {
602 return;
603 }
604
605 if (!sScriptMgr->OnPlayerBeforeQuestComplete(this, quest_id))
606 {
607 return;
608 }
609
611
612 auto log_slot = FindQuestSlot(quest_id);
613 if (log_slot < MAX_QUEST_LOG_SIZE)
614 {
616 }
617
618 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
619 if (qInfo && qInfo->HasFlag(QUEST_FLAGS_TRACKING))
620 {
621 RewardQuest(qInfo, 0, this, false);
622 }
623
624 // Xinef: area auras may change on quest completion!
628
629 // check if Quest Tracker is enabled
630 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
631 {
632 // prepare Quest Tracker datas
633 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_COMPLETE_TIME);
634 stmt->SetData(0, quest_id);
635 stmt->SetData(1, GetGUID().GetCounter());
636
637 // add to Quest Tracker
638 CharacterDatabase.Execute(stmt);
639 }
640}
@ CHAR_UPD_QUEST_TRACK_COMPLETE_TIME
Definition CharacterDatabase.h:505
@ ADDITIONAL_SAVING_INVENTORY_AND_GOLD
Definition Player.h:987
@ QUEST_FLAGS_TRACKING
Definition QuestDef.h:142
void RewardQuest(Quest const *quest, uint32 reward, Object *questGiver, bool announce=true, bool isLFGReward=false)
Definition PlayerQuest.cpp:659
void SetQuestStatus(uint32 questId, QuestStatus status, bool update=true)
Definition PlayerQuest.cpp:1479

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CHAR_UPD_QUEST_TRACK_COMPLETE_TIME, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, FindQuestSlot(), WorldObject::GetAreaId(), Object::GetGUID(), WorldObject::GetZoneId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_TRACKING, QUEST_STATE_COMPLETE, QUEST_STATUS_COMPLETE, RewardQuest(), SetQuestSlotState(), SetQuestStatus(), sObjectMgr, sScriptMgr, sWorld, UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by AddQuestAndCheckCompletion(), AreaExploredOrEventHappens(), WorldSession::HandleQuestgiverRequestRewardOpcode(), ItemAddedQuestCheck(), KillCreditGO(), KilledMonsterCredit(), KilledPlayerCreditForQuest(), MoneyChanged(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_plucky::OnGossipSelect(), ReputationChanged(), ReputationChanged2(), PlayerMenu::SendQuestGiverRequestItems(), TalkedToCreature(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ ContinueTaxiFlight()

void Player::ContinueTaxiFlight ( )
10475{
10476 uint32 sourceNode = m_taxi.GetTaxiSource();
10477 if (!sourceNode)
10478 return;
10479
10480 LOG_DEBUG("entities.unit", "WORLD: Restart character {} taxi flight", GetGUID().ToString());
10481
10482 uint32 mountDisplayId = sObjectMgr->GetTaxiMountDisplayId(sourceNode, GetTeamId(true), true);
10483 if (!mountDisplayId)
10484 return;
10485
10487
10488 // search appropriate start path node
10489 uint32 startNode = 0;
10490
10491 TaxiPathNodeList const& nodeList = sTaxiPathNodesByPath[path];
10492
10493 float bestDist = SIZE_OF_GRIDS * SIZE_OF_GRIDS; // xinef: large value
10494 float currDist = 0.0f;
10495
10496 // xinef: changed to -1, we dont want to catch last node
10497 for (uint32 i = 0; i < nodeList.size() - 1; ++i)
10498 {
10499 TaxiPathNodeEntry const* node = nodeList[i];
10500 TaxiPathNodeEntry const* nextNode = nodeList[i + 1];
10501
10502 // xinef: skip nodes at another map, get last valid node on current map
10503 if (nextNode->mapid != GetMapId() || node->mapid != GetMapId())
10504 continue;
10505
10506 currDist = (node->x - GetPositionX()) * (node->x - GetPositionX()) + (node->y - GetPositionY()) * (node->y - GetPositionY()) + (node->z - GetPositionZ()) * (node->z - GetPositionZ());
10507 if (currDist < bestDist)
10508 {
10509 startNode = i;
10510 bestDist = currDist;
10511 }
10512 }
10513
10514 // xinef: no proper node was found
10515 if (startNode == 0)
10516 {
10518 return;
10519 }
10520
10522 {
10524 }
10525
10526 if (IsMounted())
10527 {
10529 }
10530
10531 SetCanTeleport(true);
10532
10533 GetSession()->SendDoFlight(mountDisplayId, path, startNode);
10534}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
std::vector< TaxiPathNodeEntry const * > TaxiPathNodeList
Definition DBCStructure.h:2246
#define SIZE_OF_GRIDS
Definition MapDefines.h:26
uint32 GetTaxiSource() const
Definition PlayerTaxi.h:63
uint32 GetCurrentTaxiPath() const
Definition PlayerTaxi.cpp:213
void SetCanTeleport(bool value)
Definition Player.h:2502
Definition DBCStructure.h:1974
float y
Definition DBCStructure.h:1980
float x
Definition DBCStructure.h:1979
uint32 mapid
Definition DBCStructure.h:1978
float z
Definition DBCStructure.h:1981

References PlayerTaxi::ClearTaxiDestinations(), PlayerTaxi::GetCurrentTaxiPath(), Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Unit::IsInDisallowedMountForm(), Unit::IsMounted(), LOG_DEBUG, m_taxi, TaxiPathNodeEntry::mapid, Unit::RemoveAurasByType(), WorldSession::SendDoFlight(), SetCanTeleport(), SIZE_OF_GRIDS, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sTaxiPathNodesByPath, Position::ToString(), TaxiPathNodeEntry::x, TaxiPathNodeEntry::y, and TaxiPathNodeEntry::z.

Referenced by WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), and ProcessDelayedOperations().

◆ ConvertRune()

void Player::ConvertRune ( uint8  index,
RuneType  newType 
)
13465{
13466 SetCurrentRune(index, newType);
13467
13469 data << uint8(index);
13470 data << uint8(newType);
13471 SendDirectMessage(&data);
13472}
void SetCurrentRune(uint8 index, RuneType currentRune)
Definition Player.h:2519
@ SMSG_CONVERT_RUNE
Definition Opcodes.h:1188

References SendDirectMessage(), SetCurrentRune(), and SMSG_CONVERT_RUNE.

Referenced by AddRuneByAuraEffect(), RemoveRunesByAuraEffect(), and RestoreBaseRune().

◆ CorrectMetaGemEnchants()

void Player::CorrectMetaGemEnchants ( uint8  slot,
bool  apply 
)
11229{
11230 //cycle all equipped items
11231 for (uint32 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11232 {
11233 //enchants for the slot being socketed are handled by Player::ApplyItemMods
11234 if (slot == exceptslot)
11235 continue;
11236
11237 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11238
11239 if (!pItem || !pItem->HasSocket())
11240 continue;
11241
11242 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11243 {
11244 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11245 if (!enchant_id)
11246 continue;
11247
11248 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11249 if (!enchantEntry)
11250 continue;
11251
11252 uint32 condition = enchantEntry->EnchantmentCondition;
11253 if (condition)
11254 {
11255 //was enchant active with/without item?
11256 bool wasactive = EnchantmentFitsRequirements(condition, apply ? exceptslot : -1);
11257 //should it now be?
11258 if (wasactive ^ EnchantmentFitsRequirements(condition, apply ? -1 : exceptslot))
11259 {
11260 // ignore item gem conditions
11261 //if state changed, (dis)apply enchant
11262 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), !wasactive, true, true);
11263 }
11264 }
11265 }
11266 }
11267}

References ApplyEnchantment(), SpellItemEnchantmentEntry::EnchantmentCondition, EnchantmentFitsRequirements(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, and sSpellItemEnchantmentStore.

Referenced by _ApplyItemMods().

◆ Create()

bool Player::Create ( ObjectGuid::LowType  guidlow,
CharacterCreateInfo createInfo 
)
Todo:
: need more checks against packet modifications
483{
484 // FIXME: outfitId not used in player creating
486 // should check that skin, face, hair* are valid via DBC per race/class
487 // also do it in Player::BuildEnumData, Player::LoadFromDB
488
490
491 m_name = createInfo->Name;
492
493 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(createInfo->Race, createInfo->Class);
494 if (!info)
495 {
496 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid race/class pair ({}/{}) - refusing to do so.",
497 GetSession()->GetAccountId(), m_name, createInfo->Race, createInfo->Class);
498 return false;
499 }
500
501 for (uint8 i = 0; i < PLAYER_SLOTS_COUNT; i++)
502 m_items[i] = nullptr;
503
504 Relocate(info->positionX, info->positionY, info->positionZ, info->orientation);
505
506 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(createInfo->Class);
507 if (!cEntry)
508 {
509 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid character class ({}) - refusing to do so (wrong DBC-files?)",
510 GetSession()->GetAccountId(), m_name, createInfo->Class);
511 return false;
512 }
513
514 SetMap(sMapMgr->CreateMap(info->mapId, this));
515
516 uint8 powertype = cEntry->powerType;
517
518 SetObjectScale(1.0f);
519
520 m_realRace = createInfo->Race; // set real race flag
521 m_race = createInfo->Race; // set real race flag
522
523 SetFactionForRace(createInfo->Race);
524
525 if (!IsValidGender(createInfo->Gender))
526 {
527 LOG_ERROR("entities.player", "Player::Create: Possible hacking-attempt: Account {} tried creating a character named '{}' with an invalid gender ({}) - refusing to do so",
528 GetSession()->GetAccountId(), m_name, createInfo->Gender);
529 return false;
530 }
531
532 uint32 RaceClassGender = (createInfo->Race) | (createInfo->Class << 8) | (createInfo->Gender << 16);
533
534 SetUInt32Value(UNIT_FIELD_BYTES_0, (RaceClassGender | (powertype << 24)));
536 if (sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_PVP || sWorld->getIntConfig(CONFIG_GAME_TYPE) == REALM_TYPE_RPPVP)
537 {
540 }
542 SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
543 SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); // default for players in 3.0.3
544
545 // -1 is default value
547
548 SetUInt32Value(PLAYER_BYTES, (createInfo->Skin | (createInfo->Face << 8) | (createInfo->HairStyle << 16) | (createInfo->HairColor << 24)));
550 (0x00 << 8) |
551 (0x00 << 16) |
552 (((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED) << 24)));
553 SetByteValue(PLAYER_BYTES_3, 0, createInfo->Gender);
554 SetByteValue(PLAYER_BYTES_3, 3, 0); // BattlefieldArenaFaction (0 or 1)
555
559
560 for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
561 SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
563
568
569 // set starting level
571 ? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
573
575 {
576 uint32 gm_level = sWorld->getIntConfig(CONFIG_START_GM_LEVEL);
577 if (gm_level > start_level)
578 start_level = gm_level;
579 }
580
581 SetUInt32Value(UNIT_FIELD_LEVEL, start_level);
582
583 InitRunes();
584
586 ? sWorld->getIntConfig(CONFIG_START_PLAYER_MONEY)
590
591 // Played time
595
596 // base stats and related field values
601 InitPrimaryProfessions(); // to max set before any spell added
602
603 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
605 {
606 UpdateMaxPower(POWER_MANA); // Update max Mana (for add bonus from intellect)
608 }
609
611 {
616 }
617
618 // original spells
621
622 // original action bar
623 for (PlayerCreateInfoActions::const_iterator action_itr = info->action.begin(); action_itr != info->action.end(); ++action_itr)
624 addActionButton(action_itr->button, action_itr->action, action_itr->type);
625
626 // original items
627 if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Gender))
628 {
629 for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
630 {
631 if (oEntry->ItemId[j] <= 0)
632 continue;
633
634 uint32 itemId = oEntry->ItemId[j];
635
636 // just skip, reported in ObjectMgr::LoadItemTemplates
637 ItemTemplate const* iProto = sObjectMgr->GetItemTemplate(itemId);
638 if (!iProto)
639 continue;
640
641 // BuyCount by default
642 uint32 count = iProto->BuyCount;
643
644 // special amount for food/drink
645 if (iProto->Class == ITEM_CLASS_CONSUMABLE && iProto->SubClass == ITEM_SUBCLASS_FOOD)
646 {
647 switch (iProto->Spells[0].SpellCategory)
648 {
649 case SPELL_CATEGORY_FOOD: // food
651 break;
652 case SPELL_CATEGORY_DRINK: // drink
653 count = 2;
654 break;
655 }
656 if (iProto->GetMaxStackSize() < count)
657 count = iProto->GetMaxStackSize();
658 }
659 StoreNewItemInBestSlots(itemId, count);
660 }
661 }
662
663 for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr != info->item.end(); ++item_id_itr)
664 StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
665
666 // bags and main-hand weapon must equipped at this moment
667 // now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
668 // or ammo not equipped in special bag
670 {
671 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
672 {
673 uint16 eDest;
674 // equip offhand weapon/shield if it attempt equipped before main-hand weapon
675 InventoryResult msg = CanEquipItem(NULL_SLOT, eDest, pItem, false);
676 if (msg == EQUIP_ERR_OK)
677 {
679 EquipItem(eDest, pItem, true);
680 }
681 // move other items to more appropriate slots (ammo not equipped in special bag)
682 else
683 {
684 ItemPosCountVec sDest;
685 msg = CanStoreItem(NULL_BAG, NULL_SLOT, sDest, pItem, false);
686 if (msg == EQUIP_ERR_OK)
687 {
689 pItem = StoreItem(sDest, pItem, true);
690 }
691
692 // if this is ammo then use it
693 msg = CanUseAmmo(pItem->GetEntry());
694 if (msg == EQUIP_ERR_OK)
695 SetAmmo(pItem->GetEntry());
696 }
697 }
698 }
699 // all item positions resolved
700
701 // ensure player starts with full health
704
706
707 return true;
708}
CharStartOutfitEntry const * GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender)
Definition DBCStores.cpp:842
DBCStorage< ChrClassesEntry > sChrClassesStore(ChrClassesEntryfmt)
#define MAX_OUTFIT_ITEMS
Definition DBCStructure.h:617
@ ITEM_CLASS_CONSUMABLE
Definition ItemTemplate.h:291
@ ITEM_SUBCLASS_FOOD
Definition ItemTemplate.h:319
@ REST_STATE_RAF_LINKED
Definition Player.h:981
@ REST_STATE_NOT_RAF_LINKED
Definition Player.h:980
@ REALM_TYPE_RPPVP
Definition Realm.h:58
@ REALM_TYPE_PVP
Definition Realm.h:55
@ POWER_RUNIC_POWER
Definition SharedDefines.h:286
@ POWER_RUNE
Definition SharedDefines.h:285
@ SPELL_CATEGORY_DRINK
Definition SharedDefines.h:355
@ SPELL_CATEGORY_FOOD
Definition SharedDefines.h:354
@ CLASS_CONTEXT_INIT
Definition UnitDefines.h:231
@ UNIT_FLAG2_REGENERATE_POWER
Definition UnitDefines.h:303
@ UNIT_BYTE2_FLAG_PVP
Definition UnitDefines.h:136
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:257
@ PLAYER_GUILD_TIMESTAMP
Definition UpdateFields.h:185
@ PLAYER_GUILDID
Definition UpdateFields.h:179
@ PLAYER_FIELD_COINAGE
Definition UpdateFields.h:359
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137
@ PLAYER_GUILDRANK
Definition UpdateFields.h:180
@ UNIT_FIELD_HOVERHEIGHT
Definition UpdateFields.h:173
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
@ CONFIG_START_HEROIC_PLAYER_MONEY
Definition WorldConfig.h:194
@ CONFIG_GAME_TYPE
Definition WorldConfig.h:171
@ CONFIG_START_GM_LEVEL
Definition WorldConfig.h:213
@ CONFIG_START_HEROIC_PLAYER_LEVEL
Definition WorldConfig.h:192
@ CONFIG_START_ARENA_POINTS
Definition WorldConfig.h:199
@ CONFIG_START_PLAYER_MONEY
Definition WorldConfig.h:193
@ CONFIG_START_PLAYER_LEVEL
Definition WorldConfig.h:191
@ CONFIG_START_HONOR_POINTS
Definition WorldConfig.h:197
uint8 HairColor
Definition WorldSession.h:320
uint8 Skin
Definition WorldSession.h:317
uint8 Class
Definition WorldSession.h:315
std::string Name
User specified variables.
Definition WorldSession.h:313
uint8 FacialHair
Definition WorldSession.h:321
uint8 HairStyle
Definition WorldSession.h:319
uint8 Face
Definition WorldSession.h:318
uint8 Gender
Definition WorldSession.h:316
uint8 Race
Definition WorldSession.h:314
void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
Definition Object.cpp:123
void SetInt32Value(uint16 index, int32 value)
Definition Object.cpp:626
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:726
void SetUInt64Value(uint16 index, uint64 value)
Definition Object.cpp:660
void SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:900
bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count)
Definition Player.cpp:710
void InitPrimaryProfessions()
Definition Player.cpp:11520
void InitGlyphsForLevel()
Definition Player.cpp:13333
void UpdateMaxPower(Powers power) override
Definition StatSystem.cpp:326
void LearnCustomSpells()
Definition Player.cpp:11887
void SetArenaPoints(uint32 value)
Definition Player.cpp:6288
void SetObjectScale(float scale) override
Definition Player.h:1085
void InitDisplayIds()
Definition Player.cpp:10638
InventoryResult CanUseAmmo(uint32 item) const
Definition PlayerStorage.cpp:2468
void SetAmmo(uint32 item)
Definition PlayerStorage.cpp:2498
void SetHonorPoints(uint32 value)
Definition Player.cpp:6267
void InitTaxiNodesForLevel()
Definition Player.h:1146
void InitStatsForLevel(bool reapplyMods=false)
Definition Player.cpp:2575
Item * EquipItem(uint16 pos, Item *pItem, bool update)
Definition PlayerStorage.cpp:2727
void InitRunes()
Definition Player.cpp:13503
void SetMap(Map *map) override
Definition Player.cpp:14793
void SetFactionForRace(uint8 race)
Definition Player.cpp:5868
void CheckAllAchievementCriteria()
Definition Player.cpp:13953
bool HasActivePowerType(Powers power) override
Definition Player.cpp:2743
void LearnDefaultSkills()
Definition Player.cpp:11913
void SetFullHealth()
Definition Unit.h:1088
uint8 m_realRace
Definition Unit.h:2098
uint8 m_race
Definition Unit.h:2099
void SetUnitFlag2(UnitFlags2 flags)
Definition Unit.h:739
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15646
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:733
Definition DBCStructure.h:620
Definition DBCStructure.h:653
uint32 powerType
Definition DBCStructure.h:656
float orientation
Definition Player.h:340
PlayerCreateInfoActions action
Definition Player.h:346
PlayerCreateInfoItems item
Definition Player.h:343
void Relocate(float x, float y)
Definition Position.h:77
uint32 SpellCategory
Definition ItemTemplate.h:596

References Object::_Create(), PlayerInfo::action, addActionButton(), ItemTemplate::BuyCount, CanEquipItem(), CanStoreItem(), CanUseAmmo(), CheckAllAchievementCriteria(), ItemTemplate::Class, CharacterCreateInfo::Class, CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, CONFIG_GAME_TYPE, CONFIG_START_ARENA_POINTS, CONFIG_START_GM_LEVEL, CONFIG_START_HEROIC_PLAYER_LEVEL, CONFIG_START_HEROIC_PLAYER_MONEY, CONFIG_START_HONOR_POINTS, CONFIG_START_PLAYER_LEVEL, CONFIG_START_PLAYER_MONEY, EQUIP_ERR_OK, EquipItem(), CharacterCreateInfo::Face, CharacterCreateInfo::FacialHair, CharacterCreateInfo::Gender, GetCharStartOutfitEntry(), GameTime::GetGameTime(), GetItemByPos(), Unit::GetMaxPower(), ItemTemplate::GetMaxStackSize(), GetSession(), CharacterCreateInfo::HairColor, CharacterCreateInfo::HairStyle, HasActivePowerType(), InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, IsClass(), AccountMgr::IsPlayerAccount(), IsValidGender(), PlayerInfo::item, ITEM_CLASS_CONSUMABLE, ITEM_SUBCLASS_FOOD, KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), LOG_ERROR, m_items, m_Last_tick, WorldObject::m_name, m_Played_time, Unit::m_race, Unit::m_realRace, PlayerInfo::mapId, MAX_OUTFIT_ITEMS, CharacterCreateInfo::Name, NULL_BAG, NULL_SLOT, PlayerInfo::orientation, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, Player, PLAYER__FIELD_KNOWN_TITLES, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_FIELD_COINAGE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_GUILD_TIMESTAMP, PLAYER_GUILDID, PLAYER_GUILDRANK, PLAYER_SLOTS_COUNT, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, POWER_MANA, POWER_RUNE, POWER_RUNIC_POWER, ChrClassesEntry::powerType, CharacterCreateInfo::Race, REALM_TYPE_PVP, REALM_TYPE_RPPVP, Position::Relocate(), RemoveItem(), REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, sChrClassesStore, SetAmmo(), SetArenaPoints(), Object::SetByteFlag(), Object::SetByteValue(), SetFactionForRace(), Object::SetFloatValue(), Unit::SetFullHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetUInt32Value(), Object::SetUInt64Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), CharacterCreateInfo::Skin, sMapMgr, sObjectMgr, SPELL_CATEGORY_DRINK, SPELL_CATEGORY_FOOD, _Spell::SpellCategory, ItemTemplate::Spells, StoreItem(), StoreNewItemInBestSlots(), ItemTemplate::SubClass, sWorld, UNIT_BYTE2_FLAG_PVP, UNIT_FIELD_BYTES_0, UNIT_FIELD_BYTES_2, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MOD_CAST_SPEED, UpdateAllStats(), and UpdateMaxPower().

◆ CreateCorpse()

Corpse * Player::CreateCorpse ( )
4612{
4613 // prevent existence 2 corpse for player
4615
4616 uint32 _uf, _pb, _pb2, _cfb1, _cfb2;
4617
4619 SetPvPDeath(false);
4620
4621 if (!corpse->Create(GetMap()->GenerateLowGuid<HighGuid::Corpse>(), this))
4622 {
4623 delete corpse;
4624 return nullptr;
4625 }
4626
4628
4629 _uf = getRace();
4632
4633 uint8 race = (uint8)(_uf);
4634 uint8 skin = (uint8)(_pb);
4635 uint8 face = (uint8)(_pb >> 8);
4636 uint8 hairstyle = (uint8)(_pb >> 16);
4637 uint8 haircolor = (uint8)(_pb >> 24);
4638 uint8 facialhair = (uint8)(_pb2);
4639
4640 _cfb1 = ((0x00) | (race << 8) | (GetByteValue(PLAYER_BYTES_3, 0) << 16) | (skin << 24));
4641 _cfb2 = ((face) | (hairstyle << 8) | (haircolor << 16) | (facialhair << 24));
4642
4643 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1);
4644 corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2);
4645
4646 uint32 flags = CORPSE_FLAG_UNK2;
4648 flags |= CORPSE_FLAG_HIDE_HELM;
4650 flags |= CORPSE_FLAG_HIDE_CLOAK;
4651
4652 // Xinef: Player can loop corpses while in BG or in WG
4653 if (InBattleground() && !InArena())
4654 flags |= CORPSE_FLAG_LOOTABLE;
4655 Battlefield* Bf = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
4656 if (Bf && Bf->IsWarTime())
4657 flags |= CORPSE_FLAG_LOOTABLE;
4658
4659 corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
4660
4662
4664
4665 uint32 iDisplayID;
4666 uint32 iIventoryType;
4667 uint32 _cfi;
4668 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
4669 {
4670 if (m_items[i])
4671 {
4672 iDisplayID = m_items[i]->GetTemplate()->DisplayInfoID;
4673 iIventoryType = m_items[i]->GetTemplate()->InventoryType;
4674
4675 _cfi = iDisplayID | (iIventoryType << 24);
4676 corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi);
4677 }
4678 }
4679
4680 // register for player, but not show
4681 GetMap()->AddCorpse(corpse);
4682
4684
4685 // we do not need to save corpses for BG/arenas
4686 if (!GetMap()->IsBattlegroundOrArena())
4687 corpse->SaveToDB();
4688
4689 return corpse;
4690}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ BATTLEFIELD_BATTLEID_WG
Definition Battlefield.h:35
@ CORPSE_RESURRECTABLE_PVE
Definition Corpse.h:29
@ CORPSE_FLAG_HIDE_CLOAK
Definition Corpse.h:44
@ CORPSE_FLAG_UNK2
Definition Corpse.h:42
@ CORPSE_FLAG_HIDE_HELM
Definition Corpse.h:43
@ CORPSE_FLAG_LOOTABLE
Definition Corpse.h:45
@ CORPSE_FIELD_BYTES_2
Definition UpdateFields.h:425
@ CORPSE_FIELD_FLAGS
Definition UpdateFields.h:427
@ CORPSE_FIELD_BYTES_1
Definition UpdateFields.h:424
@ CORPSE_FIELD_DISPLAY_ID
Definition UpdateFields.h:422
@ CORPSE_FIELD_ITEM
Definition UpdateFields.h:423
@ CORPSE_FIELD_GUILD
Definition UpdateFields.h:426
Definition Battlefield.h:205
bool IsWarTime()
Return true if battle is start, false if battle is not started.
Definition Battlefield.h:248
void SaveToDB()
Definition Corpse.cpp:90
bool Create(ObjectGuid::LowType guidlow)
Definition Corpse.cpp:61
void AddCorpse(Corpse *corpse)
Definition Map.cpp:2640
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:639
WorldLocation _corpseLocation
Definition Player.h:3016
void SpawnCorpseBones(bool triggerSave=true)
Definition Player.cpp:4706
void SetPvPDeath(bool on)
Definition Player.h:1174
bool InArena() const
Definition Player.cpp:12347
uint32 GetNativeDisplayId() const
Definition Unit.h:1930
void WorldRelocate(const WorldLocation &loc)
Definition Position.h:264
void UpdatePositionData()
Definition Object.cpp:1162

References _corpseLocation, Map::AddCorpse(), BATTLEFIELD_BATTLEID_WG, CORPSE_FIELD_BYTES_1, CORPSE_FIELD_BYTES_2, CORPSE_FIELD_DISPLAY_ID, CORPSE_FIELD_FLAGS, CORPSE_FIELD_GUILD, CORPSE_FIELD_ITEM, CORPSE_FLAG_HIDE_CLOAK, CORPSE_FLAG_HIDE_HELM, CORPSE_FLAG_LOOTABLE, CORPSE_FLAG_UNK2, CORPSE_RESURRECTABLE_PVE, CORPSE_RESURRECTABLE_PVP, Corpse::Create(), ItemTemplate::DisplayInfoID, EQUIPMENT_SLOT_END, Object::GetByteValue(), GetGuildId(), WorldObject::GetMap(), Unit::GetNativeDisplayId(), Unit::getRace(), Item::GetTemplate(), Object::GetUInt32Value(), HasPlayerFlag(), InArena(), InBattleground(), ItemTemplate::InventoryType, Battlefield::IsWarTime(), m_ExtraFlags, m_items, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_EXTRA_PVP_DEATH, PLAYER_FLAGS_HIDE_CLOAK, PLAYER_FLAGS_HIDE_HELM, Corpse::SaveToDB(), sBattlefieldMgr, SetPvPDeath(), Object::SetUInt32Value(), SpawnCorpseBones(), WorldObject::UpdatePositionData(), and WorldLocation::WorldRelocate().

Referenced by BuildPlayerRepop().

◆ CreatePet() [1/2]

Pet * Player::CreatePet ( Creature creatureTarget,
uint32  spellID = 0 
)
9272{
9273 if (IsExistPet())
9274 {
9275 return nullptr;
9276 }
9277
9278 if (!creatureTarget || creatureTarget->IsPet() || creatureTarget->IsPlayer())
9279 {
9280 return nullptr;
9281 }
9282
9283 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureTarget->GetEntry());
9284 if (!creatrueTemplate->family)
9285 {
9286 // Creatures with family 0 crashes the server
9287 return nullptr;
9288 }
9289
9290 // Everything looks OK, create new pet
9291 Pet* pet = CreateTamedPetFrom(creatureTarget, spellID);
9292 if (!pet)
9293 {
9294 return nullptr;
9295 }
9296
9297 // "kill" original creature
9298 creatureTarget->DespawnOrUnsummon();
9299
9300 // calculate proper level
9301 uint8 level = (creatureTarget->GetLevel() < (GetLevel() - 5)) ? (GetLevel() - 5) : GetLevel();
9302
9303 // prepare visual effect for levelup
9304 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level - 1);
9305
9306 // add to world
9307 pet->GetMap()->AddToMap(pet->ToCreature());
9308
9309 // visual effect for levelup
9310 pet->SetUInt32Value(UNIT_FIELD_LEVEL, level);
9311
9312 // caster have pet now
9313 SetMinion(pet, true);
9314
9315 pet->InitTalentForLevel();
9316
9319
9320 return pet;
9321}
void DespawnOrUnsummon(Milliseconds msTimeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
Definition Creature.cpp:2182
void InitTalentForLevel()
Definition Pet.cpp:2228
void SavePetToDB(PetSaveMode mode)
Definition Pet.cpp:502
bool IsExistPet()
Definition Player.cpp:9265
void PetSpellInitialize()
Definition Player.cpp:9552
void SetMinion(Minion *minion, bool apply)
Definition Unit.cpp:10761
Pet * CreateTamedPetFrom(Creature *creatureTarget, uint32 spell_id=0)
Definition Unit.cpp:17377
bool IsPet() const
Definition Unit.h:780
uint32 family
Definition CreatureData.h:217

References Map::AddToMap(), Unit::CreateTamedPetFrom(), Creature::DespawnOrUnsummon(), CreatureTemplate::family, Object::GetEntry(), Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), Unit::IsPet(), Object::IsPlayer(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

Referenced by npc_commandscript::HandleNpcTameCommand(), and pet_commandscript::HandlePetCreateCommand().

◆ CreatePet() [2/2]

Pet * Player::CreatePet ( uint32  creatureEntry,
uint32  spellID = 0 
)
9324{
9325 if (IsExistPet())
9326 {
9327 return nullptr;
9328 }
9329
9330 CreatureTemplate const* creatrueTemplate = sObjectMgr->GetCreatureTemplate(creatureEntry);
9331 if (!creatrueTemplate->family)
9332 {
9333 // Creatures with family 0 crashes the server
9334 return nullptr;
9335 }
9336
9337 // Everything looks OK, create new pet
9338 Pet* pet = CreateTamedPetFrom(creatureEntry, spellID);
9339 if (!pet)
9340 {
9341 return nullptr;
9342 }
9343
9344 // prepare visual effect for levelup
9346
9347 // add to world
9348 pet->GetMap()->AddToMap(pet->ToCreature());
9349
9350 // visual effect for levelup
9352
9353 // caster have pet now
9354 SetMinion(pet, true);
9355
9356 pet->InitTalentForLevel();
9357
9360
9361 return pet;
9362}

References Map::AddToMap(), Unit::CreateTamedPetFrom(), CreatureTemplate::family, Unit::GetLevel(), WorldObject::GetMap(), Pet::InitTalentForLevel(), IsExistPet(), PET_SAVE_AS_CURRENT, PetSpellInitialize(), Pet::SavePetToDB(), Unit::SetMinion(), Unit::SetUInt32Value(), sObjectMgr, Object::ToCreature(), and UNIT_FIELD_LEVEL.

◆ Customize()

void Player::Customize ( CharacterCustomizeInfo const *  customizeInfo,
CharacterDatabaseTransaction  trans 
)
static
115{
117 stmt->SetData(0, customizeInfo->Gender);
118 stmt->SetData(1, customizeInfo->Skin);
119 stmt->SetData(2, customizeInfo->Face);
120 stmt->SetData(3, customizeInfo->HairStyle);
121 stmt->SetData(4, customizeInfo->HairColor);
122 stmt->SetData(5, customizeInfo->FacialHair);
123 stmt->SetData(6, customizeInfo->Guid.GetCounter());
124
125 CharacterDatabase.ExecuteOrAppend(trans, stmt);
126}
@ CHAR_UPD_GENDER_AND_APPEARANCE
Definition CharacterDatabase.h:317

References CHAR_UPD_GENDER_AND_APPEARANCE, CharacterDatabase, CharacterCustomizeInfo::Face, CharacterCustomizeInfo::FacialHair, CharacterCustomizeInfo::Gender, ObjectGuid::GetCounter(), CharacterRenameInfo::Guid, CharacterCustomizeInfo::HairColor, CharacterCustomizeInfo::HairStyle, PreparedStatementBase::SetData(), and CharacterCustomizeInfo::Skin.

Referenced by WorldSession::HandleCharCustomizeCallback(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ DeleteEquipmentSet()

void Player::DeleteEquipmentSet ( uint64  setGuid)
14741{
14742 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14743 {
14744 if (itr->second.Guid == setGuid)
14745 {
14746 if (itr->second.state == EQUIPMENT_SET_NEW)
14747 m_EquipmentSets.erase(itr);
14748 else
14749 itr->second.state = EQUIPMENT_SET_DELETED;
14750 break;
14751 }
14752 }
14753}

References EQUIPMENT_SET_DELETED, EQUIPMENT_SET_NEW, and m_EquipmentSets.

Referenced by WorldSession::HandleEquipmentSetDelete().

◆ DeleteFromDB()

void Player::DeleteFromDB ( ObjectGuid::LowType  lowGuid,
uint32  accountId,
bool  updateRealmChars,
bool  deleteFinally 
)
static

Deletes a character from the database

The way, how the characters will be deleted is decided based on the config option.

Parameters
playerguidthe low-GUID from the player which should be deleted
accountIdthe account id from the player
updateRealmCharswhen this flag is set, the amount of characters on that realm will be updated in the realmlist
deleteFinallyif this flag is set, the config option will be ignored and the character will be permanently removed from the database
3988{
3989 // for not existed account avoid update realm
3990 if (!accountId)
3991 updateRealmChars = false;
3992
3993 ObjectGuid playerGuid = ObjectGuid::Create<HighGuid::Player>(lowGuid);
3994
3995 uint32 charDelete_method = sWorld->getIntConfig(CONFIG_CHARDELETE_METHOD);
3996 uint32 charDelete_minLvl = sWorld->getIntConfig(CONFIG_CHARDELETE_MIN_LEVEL);
3997
3998 // if we want to finally delete the character or the character does not meet the level requirement,
3999 // we set it to mode CHAR_DELETE_REMOVE
4000 if (deleteFinally || sCharacterCache->GetCharacterLevelByGuid(playerGuid) < charDelete_minLvl)
4001 charDelete_method = CHAR_DELETE_REMOVE;
4002
4003 if (uint32 guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerGuid))
4004 if (Guild* guild = sGuildMgr->GetGuildById(guildId))
4005 guild->DeleteMember(playerGuid, false, false, true);
4006
4007 // remove from arena teams
4008 LeaveAllArenaTeams(playerGuid);
4009
4010 // close player ticket if any
4011 GmTicket* ticket = sTicketMgr->GetTicketByPlayer(playerGuid);
4012 if (ticket)
4013 sTicketMgr->CloseTicket(ticket->GetId(), playerGuid);
4014
4015 // remove from group
4016 if (ObjectGuid groupId = sCharacterCache->GetCharacterGroupGuidByGuid(playerGuid))
4017 if (Group* group = sGroupMgr->GetGroupByGUID(groupId.GetCounter()))
4018 RemoveFromGroup(group, playerGuid);
4019
4020 // Remove signs from petitions (also remove petitions if owner);
4021 RemovePetitionsAndSigns(playerGuid, 10);
4022
4023 CharacterDatabasePreparedStatement* stmt = nullptr;
4024
4025 switch (charDelete_method)
4026 {
4027 // Completely remove from the database
4028 case CHAR_DELETE_REMOVE:
4029 {
4030 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4031
4032 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_COD_ITEM_MAIL);
4033 stmt->SetData(0, lowGuid);
4034 PreparedQueryResult resultMail = CharacterDatabase.Query(stmt);
4035
4036 if (resultMail)
4037 {
4038 std::unordered_map<uint32, std::vector<Item*>> itemsByMail;
4039
4040 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
4041 stmt->SetData(0, lowGuid);
4042 PreparedQueryResult resultItems = CharacterDatabase.Query(stmt);
4043
4044 if (resultItems)
4045 {
4046 do
4047 {
4048 Field* fields = resultItems->Fetch();
4049 uint32 mailId = fields[14].Get<uint32>();
4050 if (Item* mailItem = _LoadMailedItem(playerGuid, nullptr, mailId, nullptr, fields))
4051 {
4052 itemsByMail[mailId].push_back(mailItem);
4053 }
4054 } while (resultItems->NextRow());
4055 }
4056
4057 do
4058 {
4059 Field* mailFields = resultMail->Fetch();
4060
4061 uint32 mail_id = mailFields[0].Get<uint32>();
4062 uint8 mailType = mailFields[1].Get<uint8>();
4063 uint16 mailTemplateId = mailFields[2].Get<uint16>();
4064 uint32 sender = mailFields[3].Get<uint32>();
4065 std::string subject = mailFields[4].Get<std::string>();
4066 std::string body = mailFields[5].Get<std::string>();
4067 uint32 money = mailFields[6].Get<uint32>();
4068 bool has_items = mailFields[7].Get<bool>();
4069
4070 // We can return mail now
4071 // So firstly delete the old one
4072 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
4073 stmt->SetData(0, mail_id);
4074 trans->Append(stmt);
4075
4076 // Mail is not from player
4077 if (mailType != MAIL_NORMAL)
4078 {
4079 if (has_items)
4080 {
4081 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4082 stmt->SetData(0, mail_id);
4083 trans->Append(stmt);
4084 }
4085 continue;
4086 }
4087
4088 MailDraft draft(subject, body);
4089 if (mailTemplateId)
4090 draft = MailDraft(mailTemplateId, false); // items are already included
4091
4092 auto itemsItr = itemsByMail.find(mail_id);
4093 if (itemsItr != itemsByMail.end())
4094 {
4095 for (Item* item : itemsItr->second)
4096 {
4097 draft.AddItem(item);
4098 }
4099
4100 // MailDraft will take care of freeing memory.
4101 itemsByMail.erase(itemsItr);
4102 }
4103
4104 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID);
4105 stmt->SetData(0, mail_id);
4106 trans->Append(stmt);
4107
4108 uint32 pl_account = sCharacterCache->GetCharacterAccountIdByGuid(ObjectGuid(HighGuid::Player, lowGuid));
4109
4110 draft.AddMoney(money).SendReturnToSender(pl_account, lowGuid, sender, trans);
4111 } while (resultMail->NextRow());
4112 }
4113
4114 // Unsummon and delete for pets in world is not required: player deleted from CLI or character list with not loaded pet.
4115 // NOW we can finally clear other DB data related to character
4116 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_IDS);
4117 stmt->SetData(0, lowGuid);
4118 PreparedQueryResult resultPets = CharacterDatabase.Query(stmt);
4119
4120 if (resultPets)
4121 {
4122 do
4123 {
4124 ObjectGuid::LowType petguidlow = (*resultPets)[0].Get<uint32>();
4125 Pet::DeleteFromDB(petguidlow);
4126 } while (resultPets->NextRow());
4127 }
4128
4129 // Delete char from social list of online chars
4130 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_SOCIAL);
4131 stmt->SetData(0, lowGuid);
4132 PreparedQueryResult resultFriends = CharacterDatabase.Query(stmt);
4133
4134 if (resultFriends)
4135 {
4136 do
4137 {
4138 if (Player* pFriend = ObjectAccessor::FindPlayerByLowGUID((*resultFriends)[0].Get<uint32>()))
4139 {
4140 pFriend->GetSocial()->RemoveFromSocialList(playerGuid, SOCIAL_FLAG_ALL);
4141 sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerGuid, false);
4142 }
4143 } while (resultFriends->NextRow());
4144 }
4145
4146 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER);
4147 stmt->SetData(0, lowGuid);
4148 trans->Append(stmt);
4149
4150 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA);
4151 stmt->SetData(0, lowGuid);
4152 trans->Append(stmt);
4153
4154 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_DECLINED_NAME);
4155 stmt->SetData(0, lowGuid);
4156 trans->Append(stmt);
4157
4158 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACTION);
4159 stmt->SetData(0, lowGuid);
4160 trans->Append(stmt);
4161
4162 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
4163 stmt->SetData(0, lowGuid);
4164 trans->Append(stmt);
4165
4166 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GIFT);
4167 stmt->SetData(0, lowGuid);
4168 trans->Append(stmt);
4169
4170 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_HOMEBIND);
4171 stmt->SetData(0, lowGuid);
4172 trans->Append(stmt);
4173
4174 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE);
4175 stmt->SetData(0, lowGuid);
4176 trans->Append(stmt);
4177
4178 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY);
4179 stmt->SetData(0, lowGuid);
4180 trans->Append(stmt);
4181
4182 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS);
4183 stmt->SetData(0, lowGuid);
4184 trans->Append(stmt);
4185
4186 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_REWARDED);
4187 stmt->SetData(0, lowGuid);
4188 trans->Append(stmt);
4189
4190 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION);
4191 stmt->SetData(0, lowGuid);
4192 trans->Append(stmt);
4193
4194 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL);
4195 stmt->SetData(0, lowGuid);
4196 trans->Append(stmt);
4197
4198 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SPELL_COOLDOWN);
4199 stmt->SetData(0, lowGuid);
4200 trans->Append(stmt);
4201
4202 if (sWorld->getBoolConfig(CONFIG_DELETE_CHARACTER_TICKET_TRACE))
4203 {
4205 stmt->SetData(0, lowGuid);
4206 trans->Append(stmt);
4207 }
4208 else
4209 {
4210 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS);
4211 stmt->SetData(0, lowGuid);
4212 trans->Append(stmt);
4213 }
4214
4215 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER);
4216 stmt->SetData(0, lowGuid);
4217 trans->Append(stmt);
4218
4219 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_FRIEND);
4220 stmt->SetData(0, lowGuid);
4221 trans->Append(stmt);
4222
4223 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SOCIAL_BY_GUID);
4224 stmt->SetData(0, lowGuid);
4225 trans->Append(stmt);
4226
4227 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL);
4228 stmt->SetData(0, lowGuid);
4229 trans->Append(stmt);
4230
4231 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEMS);
4232 stmt->SetData(0, lowGuid);
4233 trans->Append(stmt);
4234
4235 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_PET_BY_OWNER);
4236 stmt->SetData(0, lowGuid);
4237 trans->Append(stmt);
4238
4240 stmt->SetData(0, lowGuid);
4241 trans->Append(stmt);
4242
4243 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENTS);
4244 stmt->SetData(0, lowGuid);
4245 trans->Append(stmt);
4246
4247 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS);
4248 stmt->SetData(0, lowGuid);
4249 trans->Append(stmt);
4250
4251 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_EQUIPMENTSETS);
4252 stmt->SetData(0, lowGuid);
4253 trans->Append(stmt);
4254
4255 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER);
4256 stmt->SetData(0, lowGuid);
4257 stmt->SetData(1, lowGuid);
4258 trans->Append(stmt);
4259
4260 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER);
4261 stmt->SetData(0, lowGuid);
4262 trans->Append(stmt);
4263
4264 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_ENTRY_POINT);
4265 stmt->SetData(0, lowGuid);
4266 trans->Append(stmt);
4267
4268 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_GLYPHS);
4269 stmt->SetData(0, lowGuid);
4270 trans->Append(stmt);
4271
4272 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_DAILY_CHAR);
4273 stmt->SetData(0, lowGuid);
4274 trans->Append(stmt);
4275
4276 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR);
4277 stmt->SetData(0, lowGuid);
4278 trans->Append(stmt);
4279
4280 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR);
4281 stmt->SetData(0, lowGuid);
4282 trans->Append(stmt);
4283
4284 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR);
4285 stmt->SetData(0, lowGuid);
4286 trans->Append(stmt);
4287
4288 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_TALENT);
4289 stmt->SetData(0, lowGuid);
4290 trans->Append(stmt);
4291
4292 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SKILLS);
4293 stmt->SetData(0, lowGuid);
4294 trans->Append(stmt);
4295
4296 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_SETTINGS);
4297 stmt->SetData(0, lowGuid);
4298 trans->Append(stmt);
4299
4300 Corpse::DeleteFromDB(playerGuid, trans);
4301
4302 sScriptMgr->OnPlayerDeleteFromDB(trans, lowGuid);
4303
4304 CharacterDatabase.CommitTransaction(trans);
4305 break;
4306 }
4307 // The character gets unlinked from the account, the name gets freed up and appears as deleted ingame
4308 case CHAR_DELETE_UNLINK:
4309 {
4310 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_DELETE_INFO);
4311
4312 stmt->SetData(0, lowGuid);
4313
4314 CharacterDatabase.Execute(stmt);
4315 break;
4316 }
4317 default:
4318 LOG_ERROR("entities.player", "Player::DeleteFromDB: Unsupported delete method: {}.", charDelete_method);
4319 return;
4320 }
4321
4322 if (CharacterCacheEntry const* cache = sCharacterCache->GetCharacterCacheByGuid(playerGuid))
4323 {
4324 std::string name = cache->Name;
4325 sCharacterCache->DeleteCharacterCacheEntry(playerGuid, name);
4326 }
4327
4328 if (updateRealmChars)
4329 {
4330 sWorld->UpdateRealmCharCount(accountId);
4331 }
4332}
@ CHAR_DEL_CHAR_SOCIAL_BY_FRIEND
Definition CharacterDatabase.h:395
@ CHAR_DEL_CHAR_GIFT
Definition CharacterDatabase.h:410
@ CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER
Definition CharacterDatabase.h:478
@ CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER
Definition CharacterDatabase.h:421
@ CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER
Definition CharacterDatabase.h:420
@ CHAR_DEL_CHAR_SKILLS
Definition CharacterDatabase.h:424
@ CHAR_DEL_CHAR_PET_BY_OWNER
Definition CharacterDatabase.h:477
@ CHAR_DEL_ITEM_INSTANCE_BY_OWNER
Definition CharacterDatabase.h:128
@ CHAR_DEL_CHAR_DECLINED_NAME
Definition CharacterDatabase.h:386
@ CHAR_SEL_MAILITEMS
Definition CharacterDatabase.h:101
@ CHAR_UPD_DELETE_INFO
Definition CharacterDatabase.h:294
@ CHAR_DEL_CHAR_EQUIPMENTSETS
Definition CharacterDatabase.h:419
@ CHAR_DEL_PLAYER_ACCOUNT_DATA
Definition CharacterDatabase.h:203
@ CHAR_DEL_MAIL
Definition CharacterDatabase.h:416
@ CHAR_DEL_CHAR_TALENT
Definition CharacterDatabase.h:423
@ CHAR_SEL_CHAR_SOCIAL
Definition CharacterDatabase.h:350
@ CHAR_DEL_CHAR_INVENTORY
Definition CharacterDatabase.h:412
@ CHAR_DEL_CHAR_QUESTSTATUS
Definition CharacterDatabase.h:393
@ CHAR_DEL_CHAR_ACTION
Definition CharacterDatabase.h:408
@ CHAR_SEL_CHAR_PET_IDS
Definition CharacterDatabase.h:480
@ CHAR_DEL_CHAR_ACHIEVEMENTS
Definition CharacterDatabase.h:418
@ CHAR_SEL_CHAR_COD_ITEM_MAIL
Definition CharacterDatabase.h:349
@ CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION
Definition CharacterDatabase.h:267
@ CHAR_DEL_CHAR_REPUTATION
Definition CharacterDatabase.h:414
@ CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS
Definition CharacterDatabase.h:366
@ CHAR_DEL_CHARACTER
Definition CharacterDatabase.h:407
@ CHAR_DEL_CHAR_SOCIAL_BY_GUID
Definition CharacterDatabase.h:394
@ CHAR_DEL_CHAR_SETTINGS
Definition CharacterDatabase.h:524
@ CHAR_DEL_CHAR_SPELL
Definition CharacterDatabase.h:415
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED
Definition CharacterDatabase.h:413
@ CHAR_DEL_PLAYER_GM_TICKETS
Definition CharacterDatabase.h:266
@ CHAR_DEL_MAIL_ITEMS
Definition CharacterDatabase.h:417
@ CHAR_DEL_CHAR_INSTANCE
Definition CharacterDatabase.h:411
#define sGuildMgr
Definition GuildMgr.h:51
@ MAIL_NORMAL
Definition Mail.h:37
@ CHAR_DELETE_REMOVE
Definition Player.h:948
@ CHAR_DELETE_UNLINK
Definition Player.h:949
@ FRIEND_REMOVED
Definition SocialMgr.h:71
#define sSocialMgr
Definition SocialMgr.h:147
@ SOCIAL_FLAG_ALL
Definition SocialMgr.h:44
#define sTicketMgr
Definition TicketMgr.h:260
@ CONFIG_CHARDELETE_METHOD
Definition WorldConfig.h:312
@ CONFIG_CHARDELETE_MIN_LEVEL
Definition WorldConfig.h:313
@ CONFIG_DELETE_CHARACTER_TICKET_TRACE
Definition WorldConfig.h:95
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition Corpse.cpp:119
Definition TicketMgr.h:88
uint32 GetId() const
Definition TicketMgr.h:101
Definition Guild.h:292
void DeleteFromDB() override
Definition Pet.h:171
static void RemoveFromGroup(Group *group, ObjectGuid guid, RemoveMethod method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Player.cpp:2342
static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type)
Definition Player.cpp:10138
static void LeaveAllArenaTeams(ObjectGuid guid)
Definition Player.cpp:10206
Player * FindPlayerByLowGUID(ObjectGuid::LowType lowguid)
Definition ObjectAccessor.cpp:251
Definition CharacterCache.h:28

References _LoadMailedItem(), MailDraft::AddItem(), MailDraft::AddMoney(), CHAR_DEL_CHAR_ACHIEVEMENT_PROGRESS, CHAR_DEL_CHAR_ACHIEVEMENTS, CHAR_DEL_CHAR_ACTION, CHAR_DEL_CHAR_AURA, CHAR_DEL_CHAR_DECLINED_NAME, CHAR_DEL_CHAR_EQUIPMENTSETS, CHAR_DEL_CHAR_GIFT, CHAR_DEL_CHAR_GLYPHS, CHAR_DEL_CHAR_INSTANCE, CHAR_DEL_CHAR_INVENTORY, CHAR_DEL_CHAR_PET_BY_OWNER, CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, CHAR_DEL_CHAR_QUESTSTATUS, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED, CHAR_DEL_CHAR_REPUTATION, CHAR_DEL_CHAR_SETTINGS, CHAR_DEL_CHAR_SKILLS, CHAR_DEL_CHAR_SOCIAL_BY_FRIEND, CHAR_DEL_CHAR_SOCIAL_BY_GUID, CHAR_DEL_CHAR_SPELL, CHAR_DEL_CHAR_SPELL_COOLDOWN, CHAR_DEL_CHAR_TALENT, CHAR_DEL_CHARACTER, CHAR_DEL_GUILD_BANK_EVENTLOG_BY_PLAYER, CHAR_DEL_GUILD_EVENTLOG_BY_PLAYER, CHAR_DEL_ITEM_INSTANCE_BY_OWNER, CHAR_DEL_MAIL, CHAR_DEL_MAIL_BY_ID, CHAR_DEL_MAIL_ITEM_BY_ID, CHAR_DEL_MAIL_ITEMS, CHAR_DEL_PLAYER_ACCOUNT_DATA, CHAR_DEL_PLAYER_ENTRY_POINT, CHAR_DEL_PLAYER_GM_TICKETS, CHAR_DEL_PLAYER_HOMEBIND, CHAR_DEL_QUEST_STATUS_DAILY_CHAR, CHAR_DEL_QUEST_STATUS_MONTHLY_CHAR, CHAR_DEL_QUEST_STATUS_SEASONAL_CHAR, CHAR_DEL_QUEST_STATUS_WEEKLY_CHAR, CHAR_DELETE_REMOVE, CHAR_DELETE_UNLINK, CHAR_SEL_CHAR_COD_ITEM_MAIL, CHAR_SEL_CHAR_PET_IDS, CHAR_SEL_CHAR_SOCIAL, CHAR_SEL_MAILITEMS, CHAR_UPD_DELETE_INFO, CHAR_UPD_PLAYER_GM_TICKETS_ON_CHAR_DELETION, CharacterDatabase, CONFIG_CHARDELETE_METHOD, CONFIG_CHARDELETE_MIN_LEVEL, CONFIG_DELETE_CHARACTER_TICKET_TRACE, Pet::DeleteFromDB(), Corpse::DeleteFromDB(), ObjectAccessor::FindPlayerByLowGUID(), FRIEND_REMOVED, Field::Get(), GmTicket::GetId(), LeaveAllArenaTeams(), LOG_ERROR, MAIL_NORMAL, Player, RemoveFromGroup(), RemovePetitionsAndSigns(), sCharacterCache, MailDraft::SendReturnToSender(), PreparedStatementBase::SetData(), sGroupMgr, sGuildMgr, SOCIAL_FLAG_ALL, sScriptMgr, sSocialMgr, sTicketMgr, and sWorld.

Referenced by AccountMgr::DeleteAccount(), DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedDeleteCommand(), character_commandscript::HandleCharacterEraseCommand(), and WorldSession::HandleCharDeleteOpcode().

◆ DeleteOldCharacters() [1/2]

void Player::DeleteOldCharacters ( )
static

Characters which were kept back in the database after being deleted and are now too old (see config option "CharDelete.KeepDays"), will be completely deleted.

4338{
4339 uint32 keepDays = sWorld->getIntConfig(CONFIG_CHARDELETE_KEEP_DAYS);
4340 if (!keepDays)
4341 return;
4342
4344}
@ CONFIG_CHARDELETE_KEEP_DAYS
Definition WorldConfig.h:311
static void DeleteOldCharacters()
Definition Player.cpp:4337

References CONFIG_CHARDELETE_KEEP_DAYS, DeleteOldCharacters(), and sWorld.

Referenced by DeleteOldCharacters(), character_commandscript::HandleCharacterDeletedPurgeCommand(), and World::SetInitialWorldSettings().

◆ DeleteOldCharacters() [2/2]

void Player::DeleteOldCharacters ( uint32  keepDays)
static

Characters which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4350{
4351 LOG_INFO("server.loading", "Player::DeleteOldChars: Deleting all characters which have been deleted {} days before...", keepDays);
4352 LOG_INFO("server.loading", " ");
4353
4355 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4356 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4357
4358 if (result)
4359 {
4360 LOG_INFO("server.loading", "Player::DeleteOldChars: Found {} character(s) to delete", result->GetRowCount());
4361 do
4362 {
4363 Field* fields = result->Fetch();
4364 Player::DeleteFromDB(fields[0].Get<uint32>(), fields[1].Get<uint32>(), true, true);
4365 } while (result->NextRow());
4366 }
4367}
@ CHAR_SEL_CHAR_OLD_CHARS
Definition CharacterDatabase.h:351
constexpr auto DAY
Definition Common.h:49
static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally)
Definition Player.cpp:3987

References CHAR_SEL_CHAR_OLD_CHARS, CharacterDatabase, DAY, DeleteFromDB(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteOldRecoveryItems() [1/2]

void Player::DeleteOldRecoveryItems ( )
static

Items which were kept back in the database after being deleted and are now too old (see config option "ItemDelete.KeepDays"), will be completely deleted.

4373{
4374 uint32 keepDays = sWorld->getIntConfig(CONFIG_ITEMDELETE_KEEP_DAYS);
4375 if (!keepDays)
4376 return;
4377
4379}
@ CONFIG_ITEMDELETE_KEEP_DAYS
Definition WorldConfig.h:346
static void DeleteOldRecoveryItems()
Definition Player.cpp:4372

References CONFIG_ITEMDELETE_KEEP_DAYS, DeleteOldRecoveryItems(), and sWorld.

Referenced by DeleteOldRecoveryItems(), and World::SetInitialWorldSettings().

◆ DeleteOldRecoveryItems() [2/2]

void Player::DeleteOldRecoveryItems ( uint32  keepDays)
static

Items which were kept back in the database after being deleted and are older than the specified amount of days, will be completely deleted.

4385{
4386 LOG_INFO("server.loading", "Player::DeleteOldRecoveryItems: Deleting all items which have been deleted {} days before...", keepDays);
4387 LOG_INFO("server.loading", " ");
4388
4390 stmt->SetData(0, uint32(GameTime::GetGameTime().count() - time_t(keepDays * DAY)));
4391 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4392
4393 if (result)
4394 {
4395 LOG_INFO("server.loading", "Player::DeleteOldRecoveryItems: Found {} item(s) to delete", result->GetRowCount());
4396 do
4397 {
4398 Field* fields = result->Fetch();
4399
4400 uint32 guid = fields[0].Get<uint32>();
4401 uint32 itemEntry = fields[1].Get<uint32>();
4402
4404 deleteStmt->SetData(0, guid);
4405 CharacterDatabase.Execute(deleteStmt);
4406
4407 LOG_INFO("server.loading", "Deleted item from recovery_item table where guid {} and item id {}", guid, itemEntry);
4408 } while (result->NextRow());
4409 }
4410}
@ CHAR_SEL_RECOVERY_ITEM_OLD_ITEMS
Definition CharacterDatabase.h:513
@ CHAR_DEL_RECOVERY_ITEM_BY_GUID
Definition CharacterDatabase.h:514

References CHAR_DEL_RECOVERY_ITEM_BY_GUID, CHAR_SEL_RECOVERY_ITEM_OLD_ITEMS, CharacterDatabase, DAY, Field::Get(), GameTime::GetGameTime(), LOG_INFO, and PreparedStatementBase::SetData().

◆ DeleteRefundReference()

void Player::DeleteRefundReference ( ObjectGuid  itemGUID)
15631{
15632 RefundableItemsSet::iterator itr = m_refundableItems.find(itemGUID);
15633 if (itr != m_refundableItems.end())
15634 m_refundableItems.erase(itr);
15635}

References m_refundableItems.

Referenced by _SaveInventory(), Item::SetNotRefundable(), and Item::SetState().

◆ DestroyConjuredItems()

void Player::DestroyConjuredItems ( bool  update)
3342{
3343 // used when entering arena
3344 // destroys all conjured items
3345 LOG_DEBUG("entities.player.items", "STORAGE: DestroyConjuredItems");
3346
3347 // in inventory
3349 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3350 if (pItem->IsConjuredConsumable())
3352
3353 // in inventory bags
3355 if (Bag* pBag = GetBagByPos(i))
3356 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3357 if (Item* pItem = pBag->GetItemByPos(j))
3358 if (pItem->IsConjuredConsumable())
3359 DestroyItem(i, j, update);
3360
3361 // in equipment and bag list
3363 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3364 if (pItem->IsConjuredConsumable())
3366}

References DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and LOG_DEBUG.

Referenced by Battleground::AddPlayer().

◆ DestroyForPlayer()

void Player::DestroyForPlayer ( Player target,
bool  onDeath = false 
) const
overridevirtual

Reimplemented from Object.

3861{
3862 Unit::DestroyForPlayer(target, onDeath);
3863
3864 for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) // xinef: previously INVENTORY_SLOT_BAG_END
3865 {
3866 if (!m_items[i])
3867 continue;
3868
3869 m_items[i]->DestroyForPlayer(target);
3870 }
3871
3872 if (target == this)
3873 {
3875 {
3876 if (!m_items[i])
3877 continue;
3878
3879 m_items[i]->DestroyForPlayer(target);
3880 }
3882 {
3883 if (!m_items[i])
3884 continue;
3885
3886 m_items[i]->DestroyForPlayer(target);
3887 }
3888 }
3889}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, Object::DestroyForPlayer(), EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_START, KEYRING_SLOT_START, and m_items.

◆ DestroyItem()

void Player::DestroyItem ( uint8  bag,
uint8  slot,
bool  update 
)
3025{
3026 Item* pItem = GetItemByPos(bag, slot);
3027 if (pItem)
3028 {
3029 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
3030 // Also remove all contained items if the item is a bag.
3031 // This if () prevents item saving crashes if the condition for a bag to be empty before being destroyed was bypassed somehow.
3032 if (pItem->IsNotEmptyBag())
3033 for (uint8 i = 0; i < MAX_BAG_SIZE; ++i)
3034 DestroyItem(slot, i, update);
3035
3036 if (pItem->IsWrapped())
3037 {
3039 stmt->SetData(0, pItem->GetGUID().GetCounter());
3040 CharacterDatabase.Execute(stmt);
3041 }
3042
3044 RemoveItemDurations(pItem);
3045
3046 pItem->SetNotRefundable(this);
3047 pItem->ClearSoulboundTradeable(this);
3048 RemoveTradeableItem(pItem);
3049
3050 ApplyItemObtainSpells(pItem, false);
3051
3052 ItemRemovedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3053
3054 sScriptMgr->OnItemRemove(this, pItem);
3055
3056 if (bag == INVENTORY_SLOT_BAG_0)
3057 {
3059
3060 // equipment and equipped bags can have applied bonuses
3061 if (slot < INVENTORY_SLOT_BAG_END)
3062 {
3063 ItemTemplate const* pProto = pItem->GetTemplate();
3064
3065 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
3066 if (pProto && pProto->ItemSet)
3067 RemoveItemsSetItem(this, pProto);
3068
3069 _ApplyItemMods(pItem, slot, false);
3070 }
3071
3072 if (slot < EQUIPMENT_SLOT_END)
3073 {
3074 // remove item dependent auras and casts (only weapon and armor slots)
3076
3077 // update expertise and armor penetration - passive auras may need it
3078 switch (slot)
3079 {
3084 default:
3085 break;
3086 }
3087
3088 if (slot == EQUIPMENT_SLOT_MAINHAND)
3090 else if (slot == EQUIPMENT_SLOT_OFFHAND)
3092
3093 // equipment visual show
3094 SetVisibleItemSlot(slot, nullptr);
3095 }
3096
3097 m_items[slot] = nullptr;
3098 }
3099 else if (Bag* pBag = GetBagByPos(bag))
3100 pBag->RemoveItem(slot, update);
3101
3102 // Xinef: item is removed, remove loot from storage if any
3103 if (ItemTemplate const* proto = pItem->GetTemplate())
3104 if (proto->HasFlag(ITEM_FLAG_HAS_LOOT))
3105 sLootItemStorage->RemoveStoredLoot(pItem->GetGUID());
3106
3107 if (IsInWorld() && update)
3108 {
3109 pItem->RemoveFromWorld();
3110 pItem->DestroyForPlayer(this);
3111 }
3112
3113 //pItem->SetOwnerGUID(0);
3115 pItem->SetSlot(NULL_SLOT);
3116 pItem->SetState(ITEM_REMOVED, this);
3117 }
3118}
@ CHAR_DEL_GIFT
Definition CharacterDatabase.h:130
bool IsWrapped() const
Definition Item.h:263
void ItemRemovedQuestCheck(uint32 entry, uint32 count)
Definition PlayerQuest.cpp:1874
void RemoveItemDependentAurasAndCasts(Item *pItem)
Definition Player.cpp:12630
void RecalculateRating(CombatRating cr)
Definition Player.h:1959
void UpdateExpertise(WeaponAttackType attType)
Definition StatSystem.cpp:894
void SetVisibleItemSlot(uint8 slot, Item *pItem)
Definition PlayerStorage.cpp:2858

References _ApplyItemMods(), ApplyItemObtainSpells(), BASE_ATTACK, CHAR_DEL_GIFT, CharacterDatabase, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), DestroyItem(), ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Item::GetCount(), ObjectGuid::GetCounter(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), Item::IsNotEmptyBag(), Item::IsWrapped(), ITEM_FIELD_CONTAINED, ITEM_FLAG_HAS_LOOT, ITEM_REMOVED, ItemRemovedQuestCheck(), ItemTemplate::ItemSet, LOG_DEBUG, m_items, MAX_BAG_SIZE, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), PreparedStatementBase::SetData(), Object::SetGuidValue(), Item::SetNotRefundable(), Item::SetSlot(), Item::SetState(), SetVisibleItemSlot(), sLootItemStorage, sScriptMgr, and UpdateExpertise().

Referenced by AddQuestAndCheckCompletion(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyItemCount(), DestroyZoneLimitedItem(), WorldSession::DoLootRelease(), Spell::EffectSummonChangeItem(), bg_commandscript::HandleBagsClearCommand(), debug_commandscript::HandleDebugItemExpireCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), RefundItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), and Item::UpdateDuration().

◆ DestroyItemCount() [1/2]

void Player::DestroyItemCount ( Item item,
uint32 count,
bool  update 
)
3397{
3398 if (!pItem)
3399 return;
3400
3401 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item ({}, Entry: {}) count = {}", pItem->GetGUID().ToString(), pItem->GetEntry(), count);
3402
3403 if (pItem->GetCount() <= count)
3404 {
3405 count -= pItem->GetCount();
3406
3407 DestroyItem(pItem->GetBagSlot(), pItem->GetSlot(), update);
3408 }
3409 else
3410 {
3411 ItemRemovedQuestCheck(pItem->GetEntry(), count);
3412 pItem->SetCount(pItem->GetCount() - count);
3413 count = 0;
3414 if (IsInWorld() && update)
3415 pItem->SendUpdateToPlayer(this);
3416 pItem->SetState(ITEM_CHANGED, this);
3417 }
3418}

References DestroyItem(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetSlot(), Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), LOG_DEBUG, Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), and ObjectGuid::ToString().

◆ DestroyItemCount() [2/2]

void Player::DestroyItemCount ( uint32  item,
uint32  count,
bool  update,
bool  unequip_check = false 
)
3121{
3122 LOG_DEBUG("entities.player.items", "STORAGE: DestroyItemCount item = {}, count = {}", itemEntry, count);
3123 uint32 remcount = 0;
3124
3125 // in inventory
3127 {
3128 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3129 {
3130 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3131 {
3132 if (item->GetCount() + remcount <= count)
3133 {
3134 // all items in inventory can unequipped
3135 remcount += item->GetCount();
3137
3138 if (remcount >= count)
3139 return;
3140 }
3141 else
3142 {
3143 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3144 item->SetCount(item->GetCount() - count + remcount);
3145 if (IsInWorld() && update)
3146 item->SendUpdateToPlayer(this);
3147 item->SetState(ITEM_CHANGED, this);
3148 return;
3149 }
3150 }
3151 }
3152 }
3153
3155 {
3156 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3157 {
3158 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3159 {
3160 if (item->GetCount() + remcount <= count)
3161 {
3162 // all keys can be unequipped
3163 remcount += item->GetCount();
3165
3166 if (remcount >= count)
3167 return;
3168 }
3169 else
3170 {
3171 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3172 item->SetCount(item->GetCount() - count + remcount);
3173 if (IsInWorld() && update)
3174 item->SendUpdateToPlayer(this);
3175 item->SetState(ITEM_CHANGED, this);
3176 return;
3177 }
3178 }
3179 }
3180 }
3181
3182 // in inventory bags
3184 {
3185 if (Bag* bag = GetBagByPos(i))
3186 {
3187 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3188 {
3189 if (Item* item = bag->GetItemByPos(j))
3190 {
3191 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3192 {
3193 // all items in bags can be unequipped
3194 if (item->GetCount() + remcount <= count)
3195 {
3196 remcount += item->GetCount();
3197 DestroyItem(i, j, update);
3198
3199 if (remcount >= count)
3200 return;
3201 }
3202 else
3203 {
3204 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3205 item->SetCount(item->GetCount() - count + remcount);
3206 if (IsInWorld() && update)
3207 item->SendUpdateToPlayer(this);
3208 item->SetState(ITEM_CHANGED, this);
3209 return;
3210 }
3211 }
3212 }
3213 }
3214 }
3215 }
3216
3217 // in equipment and bag list
3219 {
3220 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3221 {
3222 if (item && item->GetEntry() == itemEntry && !item->IsInTrade())
3223 {
3224 if (item->GetCount() + remcount <= count)
3225 {
3226 if (!unequip_check || CanUnequipItem(INVENTORY_SLOT_BAG_0 << 8 | i, false) == EQUIP_ERR_OK)
3227 {
3228 remcount += item->GetCount();
3230
3231 if (remcount >= count)
3232 return;
3233 }
3234 }
3235 else
3236 {
3237 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3238 item->SetCount(item->GetCount() - count + remcount);
3239 if (IsInWorld() && update)
3240 item->SendUpdateToPlayer(this);
3241 item->SetState(ITEM_CHANGED, this);
3242 return;
3243 }
3244 }
3245 }
3246 }
3247
3248 // in bank
3250 {
3251 if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3252 {
3253 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3254 {
3255 if (item->GetCount() + remcount <= count)
3256 {
3257 remcount += item->GetCount();
3259 if (remcount >= count)
3260 return;
3261 }
3262 else
3263 {
3264 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3265 item->SetCount(item->GetCount() - count + remcount);
3266 if (IsInWorld() && update)
3267 item->SendUpdateToPlayer(this);
3268 item->SetState(ITEM_CHANGED, this);
3269 return;
3270 }
3271 }
3272 }
3273 }
3274
3275 // in bank bags
3276 for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
3277 {
3278 if (Bag* bag = GetBagByPos(i))
3279 {
3280 for (uint32 j = 0; j < bag->GetBagSize(); j++)
3281 {
3282 if (Item* item = bag->GetItemByPos(j))
3283 {
3284 if (item->GetEntry() == itemEntry && !item->IsInTrade())
3285 {
3286 // all items in bags can be unequipped
3287 if (item->GetCount() + remcount <= count)
3288 {
3289 remcount += item->GetCount();
3290 DestroyItem(i, j, update);
3291
3292 if (remcount >= count)
3293 return;
3294 }
3295 else
3296 {
3297 ItemRemovedQuestCheck(item->GetEntry(), count - remcount);
3298 item->SetCount(item->GetCount() - count + remcount);
3299 if (IsInWorld() && update)
3300 item->SendUpdateToPlayer(this);
3301 item->SetState(ITEM_CHANGED, this);
3302 return;
3303 }
3304 }
3305 }
3306 }
3307 }
3308 }
3309}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CanUnequipItem(), CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIP_ERR_OK, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, Object::IsInWorld(), ITEM_CHANGED, ItemRemovedQuestCheck(), KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by _StoreOrEquipNewItem(), AbandonQuest(), WorldSession::DoLootRelease(), Spell::EffectCreateItem2(), Spell::EffectEnchantItemPerm(), Spell::EffectFeedPet(), Spell::EffectScriptEffect(), FailQuest(), go_ahune_ice_stone::GossipSelect(), misc_commandscript::HandleAddItemCommand(), spell_brewfest_fill_keg::HandleAfterHit(), spell_brewfest_unfill_keg::HandleAfterHit(), WorldSession::HandleDestroyItemOpcode(), spell_item_massive_seaforium_charge::HandleItemRemove(), WorldSession::HandleWrapItemOpcode(), npc_brewfest_keg_reciver::MoveInLineOfSight(), at_hor_battered_hilt_throw::OnTrigger(), npc_oculus_drakegiver::RemoveEssence(), spell_najentus_remove_spines::RemoveSpines(), RewardQuest(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), npc_cultist_engineer::sGossipSelect(), Spell::TakeAmmo(), Spell::TakeCastItem(), TakeQuestSourceItem(), and Spell::TakeReagents().

◆ DestroyZoneLimitedItem()

void Player::DestroyZoneLimitedItem ( bool  update,
uint32  new_zone 
)
3312{
3313 LOG_DEBUG("entities.player.items", "STORAGE: DestroyZoneLimitedItem in map {} and area {}", GetMapId(), new_zone);
3314
3315 // in inventory
3317 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3318 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3320
3322 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3323 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3325
3326 // in inventory bags
3328 if (Bag* pBag = GetBagByPos(i))
3329 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
3330 if (Item* pItem = pBag->GetItemByPos(j))
3331 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3332 DestroyItem(i, j, update);
3333
3334 // in equipment and bag list
3336 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3337 if (pItem->IsLimitedToAnotherMapOrZone(GetMapId(), new_zone))
3339}

References CURRENCYTOKEN_SLOT_END, DestroyItem(), EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), WorldLocation::GetMapId(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and LOG_DEBUG.

Referenced by UpdateZone().

◆ DoRandomRoll()

uint32 Player::DoRandomRoll ( uint32  minimum,
uint32  maximum 
)
16193{
16194 ASSERT(minimum <= maximum);
16195
16196 uint32 roll = urand(minimum, maximum);
16197
16199 randomRoll.Min = minimum;
16200 randomRoll.Max = maximum;
16201 randomRoll.Result = roll;
16202 randomRoll.Roller = GetGUID();
16203 if (Group* group = GetGroup())
16204 group->BroadcastPacket(randomRoll.Write(), false);
16205 else
16206 SendDirectMessage(randomRoll.Write());
16207
16208 return roll;
16209}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
Definition MiscPackets.h:131
uint32 Max
Definition MiscPackets.h:138
uint32 Result
Definition MiscPackets.h:139
WorldPacket const * Write() override
Definition MiscPackets.cpp:91
uint32 Min
Definition MiscPackets.h:137
ObjectGuid Roller
Definition MiscPackets.h:140

References ASSERT, GetGroup(), Object::GetGUID(), WorldPackets::Misc::RandomRoll::Max, WorldPackets::Misc::RandomRoll::Min, WorldPackets::Misc::RandomRoll::Result, WorldPackets::Misc::RandomRoll::Roller, SendDirectMessage(), urand(), and WorldPackets::Misc::RandomRoll::Write().

Referenced by WorldSession::HandleRandomRollOpcode(), and spell_item_worn_troll_dice::HandleScript().

◆ DropModCharge()

void Player::DropModCharge ( SpellModifier mod,
Spell spell 
)
10097{
10098 if (spell && mod->ownerAura && mod->charges > 0)
10099 {
10100 if (--mod->charges == 0)
10101 mod->charges = -1;
10102
10103 spell->m_appliedMods.insert(mod->ownerAura);
10104 }
10105}
UsedSpellMods m_appliedMods
Definition Spell.h:556
int16 charges
Definition Player.h:186

References SpellModifier::charges, Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ DuelComplete()

void Player::DuelComplete ( DuelCompleteType  type)
6437{
6438 // duel not requested
6439 if (!duel)
6440 return;
6441
6442 // Check if DuelComplete() has been called already up in the stack and in that case don't do anything else here
6443 if (duel->State == DUEL_STATE_COMPLETED)
6444 return;
6445
6446 Player* opponent = duel->Opponent;
6447 duel->State = DUEL_STATE_COMPLETED;
6448 opponent->duel->State = DUEL_STATE_COMPLETED;
6449
6450 LOG_DEBUG("entities.unit", "Player::DuelComplete: Player '{}' ({}), Opponent: '{}' ({})", GetName(), GetGUID().ToString(), opponent->GetName(), opponent->GetGUID().ToString());
6451
6453 data << uint8((type != DUEL_INTERRUPTED) ? 1 : 0);
6454 SendDirectMessage(&data);
6455 if (opponent->GetSession())
6456 {
6457 opponent->SendDirectMessage(&data);
6458 }
6459
6460 if (type != DUEL_INTERRUPTED)
6461 {
6462 data.Initialize(SMSG_DUEL_WINNER, (1 + 20)); // we guess size
6463 data << uint8(type == DUEL_WON ? 0 : 1); // 0 = just won; 1 = fled
6464 data << opponent->GetName();
6465 data << GetName();
6466 SendMessageToSet(&data, true);
6467 }
6468
6469 sScriptMgr->OnPlayerDuelEnd(opponent, this, type);
6470
6471 switch (type)
6472 {
6473 case DUEL_FLED:
6474 // if initiator and opponent are on the same team
6475 // or initiator and opponent are not PvP enabled, forcibly stop attacking
6476 if (GetTeamId() == opponent->GetTeamId())
6477 {
6478 AttackStop();
6479 opponent->AttackStop();
6480 }
6481 else
6482 {
6483 if (!IsPvP())
6484 {
6485 AttackStop();
6486 }
6487 if (!opponent->IsPvP())
6488 {
6489 opponent->AttackStop();
6490 }
6491 }
6492 break;
6493 case DUEL_WON:
6496
6497 // Credit for quest Death's Challenge
6499 {
6500 opponent->CastSpell(opponent, 52994, true);
6501 }
6502
6503 // Honor points after duel (the winner) - ImpConfig
6504 if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL))
6505 {
6506 opponent->RewardHonor(nullptr, 1, amount);
6507 }
6508
6509 break;
6510 default:
6511 break;
6512 }
6513
6514 // Victory emote spell
6515 if (type != DUEL_INTERRUPTED)
6516 {
6517 opponent->CastSpell(opponent, 52852, true);
6518 }
6519
6520 // Remove Duel Flag object
6522 if (obj)
6523 {
6524 duel->Initiator->RemoveGameObject(obj, true);
6525 }
6526
6527 /* remove auras */
6528 AuraApplicationMap& itsAuras = opponent->GetAppliedAuras();
6529 for (AuraApplicationMap::iterator i = itsAuras.begin(); i != itsAuras.end();)
6530 {
6531 Aura const* aura = i->second->GetBase();
6532 if (!i->second->IsPositive() && aura->GetCasterGUID() == GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6533 {
6534 opponent->RemoveAura(i);
6535 }
6536 else
6537 {
6538 ++i;
6539 }
6540 }
6541
6543 for (AuraApplicationMap::iterator i = myAuras.begin(); i != myAuras.end();)
6544 {
6545 Aura const* aura = i->second->GetBase();
6546 if (!i->second->IsPositive() && aura->GetCasterGUID() == opponent->GetGUID() && aura->GetApplyTime() >= duel->StartTime)
6547 RemoveAura(i);
6548 else
6549 ++i;
6550 }
6551
6552 // cleanup combo points
6553 if (GetComboTarget() == duel->Opponent)
6554 {
6556 }
6557 else if (GetComboTargetGUID() == duel->Opponent->GetPetGUID())
6558 {
6560 }
6561
6562 if (duel->Opponent->GetComboTarget() == this)
6563 {
6564 duel->Opponent->ClearComboPoints();
6565 }
6566 else if (duel->Opponent->GetComboTargetGUID() == GetPetGUID())
6567 {
6568 duel->Opponent->ClearComboPoints();
6569 }
6570
6571 //cleanups
6575 opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 0);
6576
6577 opponent->duel.reset(nullptr);
6578 duel.reset(nullptr);
6579}
@ ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL
Definition DBCEnums.h:186
@ ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL
Definition DBCEnums.h:187
@ DUEL_STATE_COMPLETED
Definition Player.h:369
@ DUEL_WON
Definition SharedDefines.h:3879
@ CLASS_CONTEXT_QUEST
Definition UnitDefines.h:233
@ PLAYER_DUEL_TEAM
Definition UpdateFields.h:184
@ CONFIG_HONOR_AFTER_DUEL
Definition WorldConfig.h:293
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
time_t GetApplyTime() const
Definition SpellAuras.h:128
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition Player.cpp:6090
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5688
bool IsPvP()
Definition Player.cpp:16244
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:659
void ClearComboPoints()
Definition Unit.cpp:16890
Unit * GetComboTarget() const
Definition Unit.h:994
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10479
ObjectGuid const GetComboTargetGUID() const
Definition Unit.h:995
ObjectGuid GetPetGUID() const
Definition Unit.h:708
@ SMSG_DUEL_WINNER
Definition Opcodes.h:393
@ SMSG_DUEL_COMPLETE
Definition Opcodes.h:392

References ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, Unit::AttackStop(), Unit::CastSpell(), CLASS_CONTEXT_QUEST, CLASS_DEATH_KNIGHT, Unit::ClearComboPoints(), CONFIG_HONOR_AFTER_DUEL, duel, DUEL_FLED, DUEL_INTERRUPTED, DUEL_STATE_COMPLETED, DUEL_WON, ObjectGuid::Empty, Unit::GetAppliedAuras(), Aura::GetApplyTime(), Aura::GetCasterGUID(), Unit::GetComboTarget(), Unit::GetComboTargetGUID(), Map::GetGameObject(), Object::GetGUID(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldObject::GetName(), Unit::GetPetGUID(), GetQuestStatus(), GetSession(), GetTeamId(), WorldPacket::Initialize(), IsClass(), IsPvP(), LOG_DEBUG, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, QUEST_STATUS_INCOMPLETE, Unit::RemoveAura(), RewardHonor(), SendDirectMessage(), SendMessageToSet(), Object::SetGuidValue(), Unit::SetUInt32Value(), SMSG_DUEL_COMPLETE, SMSG_DUEL_WINNER, sScriptMgr, sWorld, ObjectGuid::ToString(), Position::ToString(), and UpdateAchievementCriteria().

Referenced by Unit::_ExitVehicle(), CheckDuelDistance(), CleanupsBeforeDelete(), Unit::DealDamage(), WorldSession::HandleDuelCancelledOpcode(), and TeleportTo().

◆ DurabilityLoss()

void Player::DurabilityLoss ( Item item,
double  percent 
)
4763{
4764 if (!item || percent == 0.0)
4765 return;
4766
4767 uint32 pMaxDurability = item ->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4768
4769 if (!pMaxDurability)
4770 return;
4771
4772 uint32 pDurabilityLoss = uint32(pMaxDurability * percent);
4773
4774 if (pDurabilityLoss < 1)
4775 pDurabilityLoss = 1;
4776
4777 DurabilityPointsLoss(item, pDurabilityLoss);
4778}
@ ITEM_FIELD_MAXDURABILITY
Definition UpdateFields.h:70
void DurabilityPointsLoss(Item *item, int32 points)
Definition Player.cpp:4806

References DurabilityPointsLoss(), Object::GetUInt32Value(), and ITEM_FIELD_MAXDURABILITY.

Referenced by DurabilityLossAll(), Spell::EffectDurabilityDamagePCT(), and Spell::EffectSummonChangeItem().

◆ DurabilityLossAll()

void Player::DurabilityLossAll ( double  percent,
bool  inventory 
)
4737{
4739 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4740 DurabilityLoss(pItem, percent);
4741
4742 if (inventory)
4743 {
4744 // bags not have durability
4745 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4746
4748 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4749 DurabilityLoss(pItem, percent);
4750
4751 // keys not have durability
4752 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4753
4755 if (Bag* pBag = GetBagByPos(i))
4756 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4757 if (Item* pItem = GetItemByPos(i, j))
4758 DurabilityLoss(pItem, percent);
4759 }
4760}
void DurabilityLoss(Item *item, double percent)
Definition Player.cpp:4762

References DurabilityLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamagePCT(), EnvironmentalDamage(), and WorldSession::SendSpiritResurrect().

◆ DurabilityPointLossForEquipSlot()

void Player::DurabilityPointLossForEquipSlot ( EquipmentSlots  slot)
4837{
4838 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
4839 DurabilityPointsLoss(pItem, 1);
4840}

References DurabilityPointsLoss(), GetItemByPos(), and INVENTORY_SLOT_BAG_0.

Referenced by Unit::DealDamage(), and Spell::TakeAmmo().

◆ DurabilityPointsLoss()

void Player::DurabilityPointsLoss ( Item item,
int32  points 
)
4807{
4809 return;
4810
4811 int32 pMaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4812 int32 pOldDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4813 int32 pNewDurability = pOldDurability - points;
4814
4815 if (pNewDurability < 0)
4816 pNewDurability = 0;
4817 else if (pNewDurability > pMaxDurability)
4818 pNewDurability = pMaxDurability;
4819
4820 if (pOldDurability != pNewDurability)
4821 {
4822 // modify item stats _before_ Durability set to 0 to pass _ApplyItemMods internal check
4823 if (pNewDurability == 0 && pOldDurability > 0 && item->IsEquipped())
4824 _ApplyItemMods(item, item->GetSlot(), false);
4825
4826 item->SetUInt32Value(ITEM_FIELD_DURABILITY, pNewDurability);
4827
4828 // modify item stats _after_ restore durability to pass _ApplyItemMods internal check
4829 if (pNewDurability > 0 && pOldDurability == 0 && item->IsEquipped())
4830 _ApplyItemMods(item, item->GetSlot(), true);
4831
4832 item->SetState(ITEM_CHANGED, this);
4833 }
4834}
@ ITEM_FIELD_DURABILITY
Definition UpdateFields.h:69
bool HasPreventDurabilityLossAura() const
Definition Unit.h:1761

References _ApplyItemMods(), Item::GetSlot(), Object::GetUInt32Value(), Unit::HasPreventDurabilityLossAura(), Item::IsEquipped(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, Item::SetState(), and Object::SetUInt32Value().

Referenced by DurabilityLoss(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), and Spell::EffectDurabilityDamage().

◆ DurabilityPointsLossAll()

void Player::DurabilityPointsLossAll ( int32  points,
bool  inventory 
)
4781{
4783 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4784 DurabilityPointsLoss(pItem, points);
4785
4786 if (inventory)
4787 {
4788 // bags not have durability
4789 // for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
4790
4792 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4793 DurabilityPointsLoss(pItem, points);
4794
4795 // keys not have durability
4796 //for (int i = KEYRING_SLOT_START; i < KEYRING_SLOT_END; i++)
4797
4799 if (Bag* pBag = (Bag*)GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4800 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4801 if (Item* pItem = GetItemByPos(i, j))
4802 DurabilityPointsLoss(pItem, points);
4803 }
4804}

References DurabilityPointsLoss(), EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::EffectDurabilityDamage().

◆ DurabilityRepair()

uint32 Player::DurabilityRepair ( uint16  pos,
bool  cost,
float  discountMod,
bool  guildBank 
)
4859{
4860 Item* item = GetItemByPos(pos);
4861
4862 uint32 TotalCost = 0;
4863 if (!item)
4864 return TotalCost;
4865
4866 uint32 maxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
4867 if (!maxDurability)
4868 return TotalCost;
4869
4870 uint32 curDurability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
4871
4872 if (cost)
4873 {
4874 uint32 LostDurability = maxDurability - curDurability;
4875 if (LostDurability > 0)
4876 {
4877 ItemTemplate const* ditemProto = item->GetTemplate();
4878
4879 DurabilityCostsEntry const* dcost = sDurabilityCostsStore.LookupEntry(ditemProto->ItemLevel);
4880 if (!dcost)
4881 {
4882 LOG_ERROR("entities.player", "RepairDurability: Wrong item lvl {}", ditemProto->ItemLevel);
4883 return TotalCost;
4884 }
4885
4886 uint32 dQualitymodEntryId = (ditemProto->Quality + 1) * 2;
4887 DurabilityQualityEntry const* dQualitymodEntry = sDurabilityQualityStore.LookupEntry(dQualitymodEntryId);
4888 if (!dQualitymodEntry)
4889 {
4890 LOG_ERROR("entities.player", "RepairDurability: Wrong dQualityModEntry {}", dQualitymodEntryId);
4891 return TotalCost;
4892 }
4893
4894 uint32 dmultiplier = dcost->multiplier[ItemSubClassToDurabilityMultiplierId(ditemProto->Class, ditemProto->SubClass)];
4895 uint32 costs = uint32(LostDurability * dmultiplier * double(dQualitymodEntry->quality_mod));
4896
4897 costs = uint32(costs * discountMod * sWorld->getRate(RATE_REPAIRCOST));
4898
4899 if (costs == 0) //fix for ITEM_QUALITY_ARTIFACT
4900 costs = 1;
4901
4902 if (guildBank)
4903 {
4904 if (GetGuildId() == 0)
4905 {
4906 // LOG_DEBUG("entities.player", "You are not member of a guild");
4907 return TotalCost;
4908 }
4909
4910 Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
4911 if (!guild)
4912 return TotalCost;
4913
4914 if (!guild->HandleMemberWithdrawMoney(GetSession(), costs, true))
4915 return TotalCost;
4916
4917 TotalCost = costs;
4918 }
4919 else if (!HasEnoughMoney(costs))
4920 {
4921 // LOG_DEBUG("entities.player", "You do not have enough money");
4922 return TotalCost;
4923 }
4924 else
4925 ModifyMoney(-int32(costs));
4926 }
4927 }
4928
4929 item->SetUInt32Value(ITEM_FIELD_DURABILITY, maxDurability);
4930 item->SetState(ITEM_CHANGED, this);
4931
4932 // reapply mods for total broken and repaired item if equipped
4933 if (IsEquipmentPos(pos) && !curDurability)
4934 _ApplyItemMods(item, pos & 255, true);
4935 return TotalCost;
4936}
DBCStorage< DurabilityQualityEntry > sDurabilityQualityStore(DurabilityQualityfmt)
DBCStorage< DurabilityCostsEntry > sDurabilityCostsStore(DurabilityCostsfmt)
uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
Definition ItemTemplate.h:557
@ RATE_REPAIRCOST
Definition WorldConfig.h:438
bool HandleMemberWithdrawMoney(WorldSession *session, uint32 amount, bool repair=false)
Definition Guild.cpp:1694
Definition DBCStructure.h:878
uint32 multiplier[29]
Definition DBCStructure.h:880
Definition DBCStructure.h:884
float quality_mod
Definition DBCStructure.h:886
uint32 ItemLevel
Definition ItemTemplate.h:635

References _ApplyItemMods(), ItemTemplate::Class, GetGuildId(), GetItemByPos(), GetSession(), Item::GetTemplate(), Object::GetUInt32Value(), Guild::HandleMemberWithdrawMoney(), HasEnoughMoney(), IsEquipmentPos(), ITEM_CHANGED, ITEM_FIELD_DURABILITY, ITEM_FIELD_MAXDURABILITY, ItemTemplate::ItemLevel, ItemSubClassToDurabilityMultiplierId(), LOG_ERROR, ModifyMoney(), DurabilityCostsEntry::multiplier, ItemTemplate::Quality, DurabilityQualityEntry::quality_mod, RATE_REPAIRCOST, sDurabilityCostsStore, sDurabilityQualityStore, Item::SetState(), Object::SetUInt32Value(), sGuildMgr, ItemTemplate::SubClass, and sWorld.

Referenced by DurabilityRepairAll(), and WorldSession::HandleRepairItemOpcode().

◆ DurabilityRepairAll()

uint32 Player::DurabilityRepairAll ( bool  cost,
float  discountMod,
bool  guildBank 
)
4843{
4844 uint32 TotalCost = 0;
4845 // equipped, backpack, bags itself
4847 TotalCost += DurabilityRepair(((INVENTORY_SLOT_BAG_0 << 8) | i), cost, discountMod, guildBank);
4848
4849 // bank, buyback and keys not repaired
4850
4851 // items in inventory bags
4853 for (uint8 i = 0; i < MAX_BAG_SIZE; i++)
4854 TotalCost += DurabilityRepair(((j << 8) | i), cost, discountMod, guildBank);
4855 return TotalCost;
4856}
uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank)
Definition Player.cpp:4858

References DurabilityRepair(), EQUIPMENT_SLOT_START, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and MAX_BAG_SIZE.

Referenced by WorldSession::HandleRepairItemOpcode().

◆ EnchantmentFitsRequirements()

bool Player::EnchantmentFitsRequirements ( uint32  enchantmentcondition,
int8  slot 
)
11142{
11143 if (!enchantmentcondition)
11144 return true;
11145
11146 SpellItemEnchantmentConditionEntry const* Condition = sSpellItemEnchantmentConditionStore.LookupEntry(enchantmentcondition);
11147
11148 if (!Condition)
11149 return true;
11150
11151 uint8 curcount[4] = {0, 0, 0, 0};
11152
11153 //counting current equipped gem colors
11155 {
11156 if (i == slot)
11157 continue;
11159 if (pItem2 && !pItem2->IsBroken() && pItem2->HasSocket())
11160 {
11161 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot <= PRISMATIC_ENCHANTMENT_SLOT; ++enchant_slot)
11162 {
11163 if (enchant_slot == BONUS_ENCHANTMENT_SLOT)
11164 continue;
11165
11166 uint32 enchant_id = pItem2->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11167 if (!enchant_id)
11168 continue;
11169
11170 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11171 if (!enchantEntry)
11172 continue;
11173
11174 uint32 gemid = enchantEntry->GemID;
11175 if (!gemid)
11176 continue;
11177
11178 ItemTemplate const* gemProto = sObjectMgr->GetItemTemplate(gemid);
11179 if (!gemProto)
11180 continue;
11181
11182 GemPropertiesEntry const* gemProperty = sGemPropertiesStore.LookupEntry(gemProto->GemProperties);
11183 if (!gemProperty)
11184 continue;
11185
11186 uint8 GemColor = gemProperty->color;
11187
11188 for (uint8 b = 0, tmpcolormask = 1; b < 4; b++, tmpcolormask <<= 1)
11189 {
11190 if (tmpcolormask & GemColor)
11191 ++curcount[b];
11192 }
11193 }
11194 }
11195 }
11196
11197 bool activate = true;
11198
11199 for (uint8 i = 0; i < 5; i++)
11200 {
11201 if (!Condition->Color[i])
11202 continue;
11203
11204 uint32 _cur_gem = curcount[Condition->Color[i] - 1];
11205
11206 // if have <CompareColor> use them as count, else use <value> from Condition
11207 uint32 _cmp_gem = Condition->CompareColor[i] ? curcount[Condition->CompareColor[i] - 1] : Condition->Value[i];
11208
11209 switch (Condition->Comparator[i])
11210 {
11211 case 2: // requires less <color> than (<value> || <comparecolor>) gems
11212 activate &= (_cur_gem < _cmp_gem);
11213 break;
11214 case 3: // requires more <color> than (<value> || <comparecolor>) gems
11215 activate &= (_cur_gem > _cmp_gem);
11216 break;
11217 case 5: // requires at least <color> than (<value> || <comparecolor>) gems
11218 activate &= (_cur_gem >= _cmp_gem);
11219 break;
11220 }
11221 }
11222
11223 LOG_DEBUG("entities.player.items", "Checking Condition {}, there are {} Meta Gems, {} Red Gems, {} Yellow Gems and {} Blue Gems, Activate:{}", enchantmentcondition, curcount[0], curcount[1], curcount[2], curcount[3], activate ? "yes" : "no");
11224
11225 return activate;
11226}
DBCStorage< SpellItemEnchantmentConditionEntry > sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt)
DBCStorage< GemPropertiesEntry > sGemPropertiesStore(GemPropertiesEntryfmt)
@ BONUS_ENCHANTMENT_SLOT
Definition Item.h:174
Definition ConditionMgr.h:196
Definition DBCStructure.h:1015
uint32 color
Definition DBCStructure.h:1018
uint32 GemProperties
Definition ItemTemplate.h:683
Definition DBCStructure.h:1861

References BONUS_ENCHANTMENT_SLOT, GemPropertiesEntry::color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, SpellItemEnchantmentEntry::GemID, ItemTemplate::GemProperties, Item::GetEnchantmentId(), GetItemByPos(), Item::HasSocket(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), LOG_DEBUG, PRISMATIC_ENCHANTMENT_SLOT, sGemPropertiesStore, sObjectMgr, SOCK_ENCHANTMENT_SLOT, sSpellItemEnchantmentConditionStore, and sSpellItemEnchantmentStore.

Referenced by ApplyEnchantment(), and CorrectMetaGemEnchants().

◆ EnvironmentalDamage()

uint32 Player::EnvironmentalDamage ( EnviromentalDamage  type,
uint32  damage 
)
769{
771 return 0;
772
773 // Absorb, resist some environmental damage type
774 uint32 absorb = 0;
775 uint32 resist = 0;
776
777 switch (type)
778 {
779 case DAMAGE_LAVA:
780 case DAMAGE_SLIME:
781 {
782 DamageInfo dmgInfo(this, this, damage, nullptr, type == DAMAGE_LAVA ? SPELL_SCHOOL_MASK_FIRE : SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE);
783 Unit::CalcAbsorbResist(dmgInfo);
784 absorb = dmgInfo.GetAbsorb();
785 resist = dmgInfo.GetResist();
786 damage = dmgInfo.GetDamage();
787 }
788 default:
789 break;
790 }
791
792 Unit::DealDamageMods(this, damage, &absorb);
793
795 packet.Victim = GetGUID();
796 packet.Type = type != DAMAGE_FALL_TO_VOID ? type : DAMAGE_FALL;
797 packet.Amount = damage;
798 packet.Absorbed = absorb;
799 packet.Resisted = resist;
800 SendMessageToSet(packet.Write(), true);
801
802 uint32 final_damage = Unit::DealDamage(this, this, damage, nullptr, SELF_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false);
803
804 if (!IsAlive())
805 {
806 if (type == DAMAGE_FALL) // DealDamage not apply item durability loss at self damage
807 {
808 LOG_DEBUG("entities.player", "Player::EnvironmentalDamage: Player '{}' ({}) fall to death, losing {} durability",
809 GetName(), GetGUID().ToString(), sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
810 DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
811 // durability lost message
813 }
814
816 }
817
818 return final_damage;
819}
@ ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM
Definition DBCEnums.h:140
@ DAMAGE_SLIME
Definition Player.h:833
@ DAMAGE_FALL
Definition Player.h:831
@ DAMAGE_LAVA
Definition Player.h:832
@ DAMAGE_FALL_TO_VOID
Definition Player.h:835
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:311
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:310
@ SELF_DAMAGE
Definition Unit.h:255
@ DIRECT_DAMAGE
Definition Unit.h:250
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition WorldConfig.h:476
Definition Unit.h:332
uint32 GetResist() const
Definition Unit.h:368
uint32 GetDamage() const
Definition Unit.h:366
uint32 GetAbsorb() const
Definition Unit.h:367
void DurabilityLossAll(double percent, bool inventory)
Definition Player.cpp:4736
void SendDurabilityLoss()
Definition Player.cpp:4731
bool IsImmuneToEnvironmentalDamage()
Definition Player.cpp:762
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2182
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:814
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:824
Definition CombatLogPackets.h:29
ObjectGuid Victim
Definition CombatLogPackets.h:35
uint32 Amount
Definition CombatLogPackets.h:37
uint32 Absorbed
Definition CombatLogPackets.h:39
EnviromentalDamage Type
Definition CombatLogPackets.h:36
uint32 Resisted
Definition CombatLogPackets.h:38
WorldPacket const * Write() override
Definition CombatLogPackets.cpp:20

References WorldPackets::CombatLog::EnvironmentalDamageLog::Absorbed, ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, WorldPackets::CombatLog::EnvironmentalDamageLog::Amount, Unit::CalcAbsorbResist(), DAMAGE_FALL, DAMAGE_FALL_TO_VOID, DAMAGE_LAVA, DAMAGE_SLIME, Unit::DealDamage(), Unit::DealDamageMods(), DIRECT_DAMAGE, DurabilityLossAll(), DamageInfo::GetAbsorb(), DamageInfo::GetDamage(), Object::GetGUID(), WorldObject::GetName(), DamageInfo::GetResist(), Unit::IsAlive(), IsImmuneToEnvironmentalDamage(), LOG_DEBUG, RATE_DURABILITY_LOSS_ON_DEATH, WorldPackets::CombatLog::EnvironmentalDamageLog::Resisted, SELF_DAMAGE, SendDurabilityLoss(), SendMessageToSet(), SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_NATURE, SPELL_SCHOOL_MASK_NORMAL, sWorld, Position::ToString(), WorldPackets::CombatLog::EnvironmentalDamageLog::Type, UpdateAchievementCriteria(), WorldPackets::CombatLog::EnvironmentalDamageLog::Victim, and WorldPackets::CombatLog::EnvironmentalDamageLog::Write().

Referenced by Spell::EffectEnvironmentalDMG(), HandleDrowning(), and HandleFall().

◆ EquipItem()

Item * Player::EquipItem ( uint16  pos,
Item pItem,
bool  update 
)
2728{
2730 AddItemDurations(pItem);
2731
2732 uint8 bag = pos >> 8;
2733 uint8 slot = pos & 255;
2734
2735 Item* pItem2 = GetItemByPos(bag, slot);
2736
2737 if (!pItem2)
2738 {
2739 VisualizeItem(slot, pItem);
2740
2741 if (IsAlive())
2742 {
2743 ItemTemplate const* pProto = pItem->GetTemplate();
2744
2745 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2746 if (pProto && pProto->ItemSet)
2747 AddItemsSetItem(this, pItem);
2748
2749 _ApplyItemMods(pItem, slot, true);
2750
2751 if (pProto && IsInCombat() && (pProto->Class == ITEM_CLASS_WEAPON || pProto->InventoryType == INVTYPE_RELIC) && m_weaponChangeTimer == 0)
2752 {
2753 uint32 cooldownSpell = IsClass(CLASS_ROGUE, CLASS_CONTEXT_WEAPON_SWAP) ? 6123 : 6119;
2754 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(cooldownSpell);
2755
2756 if (!spellProto)
2757 LOG_ERROR("entities.player", "Weapon switch cooldown spell {} couldn't be found in Spell.dbc", cooldownSpell);
2758 else
2759 {
2761
2763
2764 WorldPacket data;
2766 SendDirectMessage(&data);
2767 }
2768 }
2769 }
2770
2771 if (IsInWorld() && update)
2772 {
2773 pItem->AddToWorld();
2774 pItem->SendUpdateToPlayer(this);
2775 }
2776
2777 ApplyEquipCooldown(pItem);
2778
2779 // update expertise and armor penetration - passive auras may need it
2780
2781 if (slot == EQUIPMENT_SLOT_MAINHAND)
2783
2784 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2786
2787 switch (slot)
2788 {
2793 default:
2794 break;
2795 }
2796 }
2797 else
2798 {
2799 pItem2->SetCount(pItem2->GetCount() + pItem->GetCount());
2800 if (IsInWorld() && update)
2801 pItem2->SendUpdateToPlayer(this);
2802
2803 // delete item (it not in any slot currently)
2804 //pItem->DeleteFromDB();
2805 if (IsInWorld() && update)
2806 {
2807 pItem->RemoveFromWorld();
2808 pItem->DestroyForPlayer(this);
2809 }
2810
2812 RemoveItemDurations(pItem);
2813
2814 pItem->SetOwnerGUID(GetGUID()); // prevent error at next SetState in case trade/mail/buy from vendor
2815 pItem->SetNotRefundable(this);
2816 pItem->ClearSoulboundTradeable(this);
2817 RemoveTradeableItem(pItem);
2818 pItem->SetState(ITEM_REMOVED, this);
2819 pItem2->SetState(ITEM_CHANGED, this);
2820
2821 ApplyEquipCooldown(pItem2);
2822 sScriptMgr->OnPlayerEquip(this, pItem2, bag, slot, update);
2823 return pItem2;
2824 }
2825
2826 // only for full equip instead adding to stack
2829
2830 sScriptMgr->OnPlayerEquip(this, pItem, bag, slot, update);
2832 return pItem;
2833}
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM
Definition DBCEnums.h:171
@ ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM
Definition DBCEnums.h:163
@ SPELL_COOLDOWN_FLAG_INCLUDE_GCD
Starts GCD in addition to normal cooldown specified in the packet.
Definition Unit.h:615
void AddGlobalCooldown(SpellInfo const *spellInfo, uint32 gcd)
Definition CharmInfo.cpp:419
void UpdateForQuestWorldObjects()
Definition PlayerUpdates.cpp:1777
void ApplyEquipCooldown(Item *pItem)
Definition Player.cpp:11821
void VisualizeItem(uint8 slot, Item *pItem)
Definition PlayerStorage.cpp:2875
uint32 StartRecoveryTime
Definition SpellInfo.h:351

References _ApplyItemMods(), ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), GlobalCooldownMgr::AddGlobalCooldown(), AddItemDurations(), AddItemsSetItem(), Object::AddToWorld(), ApplyEquipCooldown(), BASE_ATTACK, Unit::BuildCooldownPacket(), ItemTemplate::Class, CLASS_CONTEXT_WEAPON_SWAP, CLASS_ROGUE, Item::ClearSoulboundTradeable(), CR_ARMOR_PENETRATION, Object::DestroyForPlayer(), EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, Item::GetCount(), Object::GetEntry(), GetGlobalCooldownMgr(), Object::GetGUID(), GetItemByPos(), Item::GetTemplate(), ItemTemplate::InventoryType, INVTYPE_RELIC, Unit::IsAlive(), IsClass(), Unit::IsInCombat(), Object::IsInWorld(), ITEM_CHANGED, ITEM_CLASS_WEAPON, ITEM_REMOVED, ItemTemplate::ItemSet, LOG_ERROR, m_weaponChangeTimer, OFF_ATTACK, RecalculateRating(), RemoveEnchantmentDurations(), Object::RemoveFromWorld(), RemoveItemDurations(), RemoveTradeableItem(), SendDirectMessage(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetNotRefundable(), Item::SetOwnerGUID(), Item::SetState(), SPELL_COOLDOWN_FLAG_INCLUDE_GCD, sScriptMgr, sSpellMgr, SpellInfo::StartRecoveryTime, UpdateAchievementCriteria(), UpdateExpertise(), UpdateForQuestWorldObjects(), and VisualizeItem().

Referenced by Create(), Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoEquipItemOpcode(), SplitItem(), and SwapItem().

◆ EquipNewItem()

Item * Player::EquipNewItem ( uint16  pos,
uint32  item,
bool  update 
)
2708{
2709 Item* _item = Item::CreateItem(item, 1, this);
2710 if (!_item)
2711 return nullptr;
2712
2713 if (!IsEquipmentPos(pos) || sScriptMgr->OnPlayerCanSaveEquipNewItem(this, _item, pos, update))
2714 {
2715 // pussywizard: obtaining blue or better items saves to db
2716 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2717 if (pProto->Quality >= ITEM_QUALITY_RARE)
2719
2720 ItemAddedQuestCheck(item, 1);
2722 }
2723
2724 return EquipItem(pos, _item, update);
2725}
@ ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM
Definition DBCEnums.h:199
@ ITEM_QUALITY_RARE
Definition SharedDefines.h:343
void ItemAddedQuestCheck(uint32 entry, uint32 count)
Definition PlayerQuest.cpp:1835

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), Item::CreateItem(), EquipItem(), IsEquipmentPos(), ITEM_QUALITY_RARE, ItemAddedQuestCheck(), sObjectMgr, sScriptMgr, and UpdateAchievementCriteria().

Referenced by _StoreOrEquipNewItem(), and StoreNewItemInBestSlots().

◆ ExecuteOrCancelSpellCastRequest()

void Player::ExecuteOrCancelSpellCastRequest ( PendingSpellCastRequest castRequest,
bool  isCancel = false 
)
2346{
2347 if (isCancel)
2348 request->cancelInProgress = true;
2349
2350 if (WorldSession* session = GetSession())
2351 {
2352 if (request->isItem)
2353 session->HandleUseItemOpcode(request->requestPacket);
2354 else
2355 session->HandleCastSpellOpcode(request->requestPacket);
2356 }
2357}

References PendingSpellCastRequest::cancelInProgress, GetSession(), PendingSpellCastRequest::isItem, and PendingSpellCastRequest::requestPacket.

Referenced by ProcessSpellQueue().

◆ FailQuest()

void Player::FailQuest ( uint32  quest_id)
887{
888 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
889 {
890 QuestStatus qStatus = GetQuestStatus(questId);
891 // xinef: if quest is marked as failed, dont do it again
892 if ((qStatus != QUEST_STATUS_INCOMPLETE) && (!quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE)))
893 return;
894
896
897 uint16 log_slot = FindQuestSlot(questId);
898
899 if (log_slot < MAX_QUEST_LOG_SIZE)
900 {
901 SetQuestSlotTimer(log_slot, 1);
903 }
904
905 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
906 {
907 QuestStatusData& q_status = m_QuestStatus[questId];
908
909 RemoveTimedQuest(questId);
910 q_status.Timer = 0;
911
912 SendQuestTimerFailed(questId);
913 }
914 else
915 SendQuestFailed(questId);
916
917 // Destroy quest items on quest failure.
918 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
919 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
920 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
921 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
922
923 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
924 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
925 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM)
926 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
927 }
928}
@ QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE
Definition QuestDef.h:167
void SendQuestTimerFailed(uint32 quest_id)
Definition PlayerQuest.cpp:2394
void SendQuestFailed(uint32 questId, InventoryResult reason=EQUIP_ERR_OK)
Definition PlayerQuest.cpp:2382
void SetQuestSlotTimer(uint16 slot, uint32 timer)
Definition Player.h:1503
void RemoveTimedQuest(uint32 quest_id)
Definition Player.h:1554

References BIND_QUEST_ITEM, DestroyItemCount(), FindQuestSlot(), GetQuestStatus(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_SPECIAL_FLAGS_CAN_FAIL_IN_ANY_STATE, QUEST_SPECIAL_FLAGS_TIMED, QUEST_STATE_FAIL, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, RemoveTimedQuest(), SendQuestFailed(), SendQuestTimerFailed(), SetQuestSlotState(), SetQuestSlotTimer(), SetQuestStatus(), sObjectMgr, and QuestStatusData::Timer.

Referenced by npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), SmartAI::EndPath(), dragonmaw_race_npc::FailQuest(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_captain_saeed::npc_captain_saeedAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_doctor::npc_doctorAI::PatientDied(), Map::ScriptsProcess(), Update(), and npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI().

◆ FindEquipSlot()

uint8 Player::FindEquipSlot ( ItemTemplate const *  proto,
uint32  slot,
bool  swap 
) const
127{
128 uint8 slots[4];
129 slots[0] = NULL_SLOT;
130 slots[1] = NULL_SLOT;
131 slots[2] = NULL_SLOT;
132 slots[3] = NULL_SLOT;
133 switch (proto->InventoryType)
134 {
135 case INVTYPE_HEAD:
136 slots[0] = EQUIPMENT_SLOT_HEAD;
137 break;
138 case INVTYPE_NECK:
139 slots[0] = EQUIPMENT_SLOT_NECK;
140 break;
142 slots[0] = EQUIPMENT_SLOT_SHOULDERS;
143 break;
144 case INVTYPE_BODY:
145 slots[0] = EQUIPMENT_SLOT_BODY;
146 break;
147 case INVTYPE_CHEST:
148 case INVTYPE_ROBE:
149 slots[0] = EQUIPMENT_SLOT_CHEST;
150 break;
151 case INVTYPE_WAIST:
152 slots[0] = EQUIPMENT_SLOT_WAIST;
153 break;
154 case INVTYPE_LEGS:
155 slots[0] = EQUIPMENT_SLOT_LEGS;
156 break;
157 case INVTYPE_FEET:
158 slots[0] = EQUIPMENT_SLOT_FEET;
159 break;
160 case INVTYPE_WRISTS:
161 slots[0] = EQUIPMENT_SLOT_WRISTS;
162 break;
163 case INVTYPE_HANDS:
164 slots[0] = EQUIPMENT_SLOT_HANDS;
165 break;
166 case INVTYPE_FINGER:
167 slots[0] = EQUIPMENT_SLOT_FINGER1;
168 slots[1] = EQUIPMENT_SLOT_FINGER2;
169 break;
170 case INVTYPE_TRINKET:
171 slots[0] = EQUIPMENT_SLOT_TRINKET1;
172 slots[1] = EQUIPMENT_SLOT_TRINKET2;
173 break;
174 case INVTYPE_CLOAK:
175 slots[0] = EQUIPMENT_SLOT_BACK;
176 break;
177 case INVTYPE_WEAPON:
178 {
179 slots[0] = EQUIPMENT_SLOT_MAINHAND;
180
181 // suggest offhand slot only if know dual wielding
182 // (this will be replace mainhand weapon at auto equip instead unwonted "you don't known dual wielding" ...
183 if (CanDualWield())
184 slots[1] = EQUIPMENT_SLOT_OFFHAND;
185 break;
186 }
187 case INVTYPE_SHIELD:
189 case INVTYPE_HOLDABLE:
190 slots[0] = EQUIPMENT_SLOT_OFFHAND;
191 break;
192 case INVTYPE_RANGED:
194 case INVTYPE_THROWN:
195 slots[0] = EQUIPMENT_SLOT_RANGED;
196 break;
197 case INVTYPE_2HWEAPON:
198 slots[0] = EQUIPMENT_SLOT_MAINHAND;
199 if (CanDualWield() && CanTitanGrip() && proto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && proto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && proto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
201 if (ItemTemplate const* mhWeaponProto = mhWeapon->GetTemplate())
202 if (mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_POLEARM && mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_STAFF && mhWeaponProto->SubClass != ITEM_SUBCLASS_WEAPON_FISHING_POLE)
203 slots[1] = EQUIPMENT_SLOT_OFFHAND;
204 break;
205 case INVTYPE_TABARD:
206 slots[0] = EQUIPMENT_SLOT_TABARD;
207 break;
209 slots[0] = EQUIPMENT_SLOT_MAINHAND;
210 break;
211 case INVTYPE_BAG:
212 slots[0] = INVENTORY_SLOT_BAG_START + 0;
213 slots[1] = INVENTORY_SLOT_BAG_START + 1;
214 slots[2] = INVENTORY_SLOT_BAG_START + 2;
215 slots[3] = INVENTORY_SLOT_BAG_START + 3;
216 break;
217 case INVTYPE_RELIC:
218 {
219 switch (proto->SubClass)
220 {
223 slots[0] = EQUIPMENT_SLOT_RANGED;
224 break;
227 slots[0] = EQUIPMENT_SLOT_RANGED;
228 break;
231 slots[0] = EQUIPMENT_SLOT_RANGED;
232 break;
235 slots[0] = EQUIPMENT_SLOT_RANGED;
236 break;
239 slots[0] = EQUIPMENT_SLOT_RANGED;
240 break;
241 }
242 break;
243 }
244 default:
245 return NULL_SLOT;
246 }
247
248 if (slot != NULL_SLOT)
249 {
250 if (swap || !GetItemByPos(INVENTORY_SLOT_BAG_0, slot))
251 for (uint8 i = 0; i < 4; ++i)
252 if (slots[i] == slot)
253 return slot;
254 }
255 else
256 {
257 // search free slot at first
258 for (uint8 i = 0; i < 4; ++i)
259 if (slots[i] != NULL_SLOT && !GetItemByPos(INVENTORY_SLOT_BAG_0, slots[i]))
260 // in case 2hand equipped weapon (without titan grip) offhand slot empty but not free
261 if (slots[i] != EQUIPMENT_SLOT_OFFHAND || !IsTwoHandUsed())
262 return slots[i];
263
264 // if not found free and can swap return first appropriate from used
265 for (uint8 i = 0; i < 4; ++i)
266 if (slots[i] != NULL_SLOT && swap)
267 return slots[i];
268 }
269
270 // no free position
271 return NULL_SLOT;
272}
@ INVTYPE_BODY
Definition ItemTemplate.h:260
@ INVTYPE_FINGER
Definition ItemTemplate.h:267
@ INVTYPE_HEAD
Definition ItemTemplate.h:257
@ INVTYPE_ROBE
Definition ItemTemplate.h:276
@ INVTYPE_HOLDABLE
Definition ItemTemplate.h:279
@ INVTYPE_TRINKET
Definition ItemTemplate.h:268
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_WAIST
Definition ItemTemplate.h:262
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WRISTS
Definition ItemTemplate.h:265
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_BAG
Definition ItemTemplate.h:274
@ INVTYPE_NECK
Definition ItemTemplate.h:258
@ INVTYPE_SHOULDERS
Definition ItemTemplate.h:259
@ INVTYPE_FEET
Definition ItemTemplate.h:264
@ INVTYPE_SHIELD
Definition ItemTemplate.h:270
@ INVTYPE_TABARD
Definition ItemTemplate.h:275
@ INVTYPE_LEGS
Definition ItemTemplate.h:263
@ INVTYPE_CHEST
Definition ItemTemplate.h:261
@ INVTYPE_HANDS
Definition ItemTemplate.h:266
@ EQUIPMENT_SLOT_SHOULDERS
Definition Player.h:672
@ EQUIPMENT_SLOT_BODY
Definition Player.h:673
@ EQUIPMENT_SLOT_HANDS
Definition Player.h:679
@ EQUIPMENT_SLOT_NECK
Definition Player.h:671
@ EQUIPMENT_SLOT_TABARD
Definition Player.h:688
@ EQUIPMENT_SLOT_HEAD
Definition Player.h:670
@ EQUIPMENT_SLOT_LEGS
Definition Player.h:676
@ EQUIPMENT_SLOT_BACK
Definition Player.h:684
@ EQUIPMENT_SLOT_WAIST
Definition Player.h:675
@ EQUIPMENT_SLOT_FEET
Definition Player.h:677
@ EQUIPMENT_SLOT_CHEST
Definition Player.h:674
@ EQUIPMENT_SLOT_WRISTS
Definition Player.h:678

References Unit::CanDualWield(), CanTitanGrip(), CLASS_CONTEXT_EQUIP_RELIC, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_SHAMAN, CLASS_WARLOCK, EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_CHEST, EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_FINGER1, EQUIPMENT_SLOT_FINGER2, EQUIPMENT_SLOT_HANDS, EQUIPMENT_SLOT_HEAD, EQUIPMENT_SLOT_LEGS, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_NECK, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_SHOULDERS, EQUIPMENT_SLOT_TABARD, EQUIPMENT_SLOT_TRINKET1, EQUIPMENT_SLOT_TRINKET2, EQUIPMENT_SLOT_WAIST, EQUIPMENT_SLOT_WRISTS, GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_START, ItemTemplate::InventoryType, INVTYPE_2HWEAPON, INVTYPE_BAG, INVTYPE_BODY, INVTYPE_CHEST, INVTYPE_CLOAK, INVTYPE_FEET, INVTYPE_FINGER, INVTYPE_HANDS, INVTYPE_HEAD, INVTYPE_HOLDABLE, INVTYPE_LEGS, INVTYPE_NECK, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_RELIC, INVTYPE_ROBE, INVTYPE_SHIELD, INVTYPE_SHOULDERS, INVTYPE_TABARD, INVTYPE_THROWN, INVTYPE_TRINKET, INVTYPE_WAIST, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, INVTYPE_WRISTS, IsClass(), IsTwoHandUsed(), ITEM_SUBCLASS_ARMOR_IDOL, ITEM_SUBCLASS_ARMOR_LIBRAM, ITEM_SUBCLASS_ARMOR_MISC, ITEM_SUBCLASS_ARMOR_SIGIL, ITEM_SUBCLASS_ARMOR_TOTEM, ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_POLEARM, ITEM_SUBCLASS_WEAPON_STAFF, NULL_SLOT, and ItemTemplate::SubClass.

Referenced by CanEquipItem(), and WorldSession::HandleAutoEquipItemOpcode().

◆ FindQuestSlot()

uint16 Player::FindQuestSlot ( uint32  quest_id) const

◆ GetAchievementMgr()

AchievementMgr * Player::GetAchievementMgr ( ) const
inline
2540{ return m_achievementMgr; }

References m_achievementMgr.

◆ GetActionButton()

ActionButton const * Player::GetActionButton ( uint8  button)
5671{
5672 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5673 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5674 return nullptr;
5675
5676 return &buttonItr->second;
5677}

References ACTIONBUTTON_DELETED, and m_actionButtons.

Referenced by Spell::EffectCastButtons().

◆ GetActiveSpec()

◆ GetActiveSpecMask()

uint8 Player::GetActiveSpecMask ( ) const
inline

◆ GetAmmoDPS()

float Player::GetAmmoDPS ( ) const
inline
1328{ return m_ammoDPS; }

References m_ammoDPS.

Referenced by _ApplyAmmoBonuses(), and CalculateMinMaxDamage().

◆ GetArenaPersonalRating()

uint32 Player::GetArenaPersonalRating ( uint8  slot) const
16218{
16220
16221 sScriptMgr->OnPlayerGetArenaPersonalRating(const_cast<Player*>(this), slot, result);
16222
16223 return result;
16224}

References ARENA_TEAM_END, ARENA_TEAM_PERSONAL_RATING, Object::GetUInt32Value(), PLAYER_FIELD_ARENA_TEAM_INFO_1_1, and sScriptMgr.

Referenced by GetMaxPersonalArenaRatingRequirement().

◆ GetArenaPoints()

uint32 Player::GetArenaPoints ( ) const
inline

◆ GetArenaTeamId()

◆ GetArenaTeamIdFromDB()

uint32 Player::GetArenaTeamIdFromDB ( ObjectGuid  guid,
uint8  slot 
)
static
6330{
6332 stmt->SetData(0, guid.GetCounter());
6333 stmt->SetData(1, type);
6334 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6335
6336 if (!result)
6337 return 0;
6338
6339 uint32 id = (*result)[0].Get<uint32>();
6340 return id;
6341}
@ CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID
Definition CharacterDatabase.h:352

References CHAR_SEL_ARENA_TEAM_ID_BY_PLAYER_GUID, CharacterDatabase, ObjectGuid::GetCounter(), and PreparedStatementBase::SetData().

Referenced by arena_commandscript::HandleArenaCreateCommand().

◆ GetArenaTeamIdInvited()

◆ GetArmorProficiency()

uint32 Player::GetArmorProficiency ( ) const
inline
1360{ return m_ArmorProficiency; }

References m_ArmorProficiency.

Referenced by Spell::EffectProficiency().

◆ GetAttackBySlot()

◆ GetAurasForTarget()

void Player::GetAurasForTarget ( Unit target,
bool  force = false 
)

Blizz sends certain movement packets sometimes even before CreateObject These movement packets are usually found in SMSG_COMPRESSED_MOVES

12111{
12112 if (!target || (!force && target->GetVisibleAuras()->empty())) // speedup things
12113 return;
12114
12118 if (target->HasFeatherFallAura())
12119 target->SendMovementFeatherFall(this);
12120
12121 if (target->HasWaterWalkAura())
12122 target->SendMovementWaterWalking(this);
12123
12124 if (target->HasHoverAura())
12125 target->SendMovementHover(this);
12126
12128 data<< target->GetPackGUID();
12129
12130 Unit::VisibleAuraMap const* visibleAuras = target->GetVisibleAuras();
12131 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
12132 {
12133 AuraApplication* auraApp = itr->second;
12134 auraApp->BuildUpdatePacket(data, false);
12135 }
12136
12137 SendDirectMessage(&data);
12138}
Definition SpellAuras.h:37
void BuildUpdatePacket(ByteBuffer &data, bool remove) const
Definition SpellAuras.cpp:248
bool HasWaterWalkAura() const
Definition Unit.h:1755
bool HasFeatherFallAura() const
Definition Unit.h:1756
void SendMovementHover(Player *sendTo)
Definition Unit.cpp:20574
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:672
void SendMovementWaterWalking(Player *sendTo)
Definition Unit.cpp:20556
bool HasHoverAura() const
Definition Unit.h:1757
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1498
void SendMovementFeatherFall(Player *sendTo)
Definition Unit.cpp:20565
@ SMSG_AURA_UPDATE_ALL
Definition Opcodes.h:1203

References AuraApplication::BuildUpdatePacket(), Object::GetPackGUID(), Unit::GetVisibleAuras(), Unit::HasFeatherFallAura(), Unit::HasHoverAura(), Unit::HasWaterWalkAura(), SendDirectMessage(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), and SMSG_AURA_UPDATE_ALL.

Referenced by GetInitialVisiblePackets(), and Map::SendInitSelf().

◆ GetAuraUpdateMaskForRaid()

uint64 Player::GetAuraUpdateMaskForRaid ( ) const
inline

◆ GetAverageItemLevel()

float Player::GetAverageItemLevel ( )
15841{
15842 float sum = 0;
15843 uint32 count = 0;
15844 uint8 level = GetLevel();
15845
15847 {
15848 // don't check tabard, ranged, offhand or shirt
15850 continue;
15851
15852 if (m_items[i] && m_items[i]->GetTemplate())
15854
15855 ++count;
15856 }
15857
15858 return std::max<float>(0.0f, sum / (float)count);
15859}
float GetItemLevelIncludingQuality(uint8 pLevel) const
Definition ItemTemplate.h:757

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, ItemTemplate::GetItemLevelIncludingQuality(), Unit::GetLevel(), Item::GetTemplate(), and m_items.

Referenced by spell_gen_vehicle_scaling_aura::CalculateAmount(), gear_commandscript::HandleGearStatsCommand(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetAverageItemLevelForDF()

float Player::GetAverageItemLevelForDF ( )
15862{
15863 float sum = 0;
15864 uint32 count = 0;
15865 uint8 level = GetLevel();
15866
15867 for (int i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
15868 {
15869 // don't check tabard, ranged, offhand or shirt
15871 continue;
15872
15873 if (m_items[i] && m_items[i]->GetTemplate())
15874 {
15875 if (m_items[i]->GetTemplate()->Quality == ITEM_QUALITY_HEIRLOOM)
15876 sum += level * 2.33f;
15877 else
15878 sum += m_items[i]->GetTemplate()->ItemLevel;
15879 }
15880
15881 ++count;
15882 }
15883
15884 return std::max(0.0f, sum / (float)count);
15885}

References EQUIPMENT_SLOT_BODY, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, Unit::GetLevel(), Item::GetTemplate(), ITEM_QUALITY_HEIRLOOM, ItemTemplate::ItemLevel, and m_items.

Referenced by lfg::LFGMgr::InitializeLockedDungeons(), and Satisfy().

◆ GetBagByPos()

◆ GetBankBagSlotCount()

uint8 Player::GetBankBagSlotCount ( ) const
inline

◆ GetBarberShopCost()

uint32 Player::GetBarberShopCost ( uint8  newhairstyle,
uint8  newhaircolor,
uint8  newfacialhair,
BarberShopStyleEntry const *  newSkin = nullptr 
)
13297{
13298 uint8 level = GetLevel();
13299
13300 if (level > GT_MAX_LEVEL)
13301 level = GT_MAX_LEVEL; // max level in this dbc
13302
13303 uint8 hairstyle = GetByteValue(PLAYER_BYTES, 2);
13304 uint8 haircolor = GetByteValue(PLAYER_BYTES, 3);
13305 uint8 facialhair = GetByteValue(PLAYER_BYTES_2, 0);
13306 uint8 skincolor = GetByteValue(PLAYER_BYTES, 0);
13307
13308 if ((hairstyle == newhairstyle) && (haircolor == newhaircolor) && (facialhair == newfacialhair) && (!newSkin || (newSkin->hair_id == skincolor)))
13309 return 0;
13310
13311 GtBarberShopCostBaseEntry const* bsc = sGtBarberShopCostBaseStore.LookupEntry(level - 1);
13312
13313 if (!bsc) // shouldn't happen
13314 return 0xFFFFFFFF;
13315
13316 float cost = 0;
13317
13318 if (hairstyle != newhairstyle)
13319 cost += bsc->cost; // full price
13320
13321 if ((haircolor != newhaircolor) && (hairstyle == newhairstyle))
13322 cost += bsc->cost * 0.5f; // +1/2 of price
13323
13324 if (facialhair != newfacialhair)
13325 cost += bsc->cost * 0.75f; // +3/4 of price
13326
13327 if (newSkin && skincolor != newSkin->hair_id)
13328 cost += bsc->cost * 0.75f; // +5/6 of price
13329
13330 return uint32(cost);
13331}
DBCStorage< GtBarberShopCostBaseEntry > sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt)
#define GT_MAX_LEVEL
Definition DBCStructure.h:1037
Definition DBCStructure.h:1043
float cost
Definition DBCStructure.h:1044

References GtBarberShopCostBaseEntry::cost, Object::GetByteValue(), Unit::GetLevel(), GT_MAX_LEVEL, BarberShopStyleEntry::hair_id, PLAYER_BYTES, PLAYER_BYTES_2, and sGtBarberShopCostBaseStore.

Referenced by WorldSession::HandleAlterAppearance().

◆ GetBaseDefenseSkillValue()

uint32 Player::GetBaseDefenseSkillValue ( ) const
inline
@ SKILL_DEFENSE
Definition SharedDefines.h:3131
uint16 GetBaseSkillValue(uint32 skill) const
Definition Player.cpp:5520

References GetBaseSkillValue(), and SKILL_DEFENSE.

Referenced by UpdateCombatSkills().

◆ GetBaseModValue()

float Player::GetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType 
) const
5078{
5079 if (modGroup >= BASEMOD_END)
5080 {
5081 LOG_ERROR("entities.player", "trial to access non existed BaseModGroup!");
5082 return 0.0f;
5083 }
5084
5085 if (modType == PCT_MOD && m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5086 return 0.0f;
5087
5088 return m_auraBaseMod[modGroup][modType];
5089}

References BASEMOD_END, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetBaseRune()

RuneType Player::GetBaseRune ( uint8  index) const
inline
2510{ return RuneType(m_runes->runes[index].BaseRune); }
RuneType
Definition Player.h:404
uint8 BaseRune
Definition Player.h:414
RuneInfo runes[MAX_RUNES]
Definition Player.h:423

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by Spell::EffectActivateRune(), GetRuneBaseCooldown(), IsBaseRuneSlotsOnCooldown(), RemoveRunesByAuraEffect(), RestoreBaseRune(), Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetBaseSkillValue()

uint16 Player::GetBaseSkillValue ( uint32  skill) const
5521{
5522 if (!skill)
5523 return 0;
5524
5525 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5526 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5527 return 0;
5528
5529 int32 result = int32(SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5530 result += SKILL_PERM_BONUS(GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos)));
5531 return result < 0 ? 0 : result;
5532}
#define SKILL_PERM_BONUS(x)
Definition Player.h:88

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_VALUE.

Referenced by npc_engineering_tele_trinket::CanLearn(), GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), GetTrainerSpellState(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), and SatisfyQuestSkill().

◆ GetBaseSpellDamageBonus()

uint32 Player::GetBaseSpellDamageBonus ( )
inline
1969{ return m_baseSpellDamage; }

References m_baseSpellDamage.

Referenced by Unit::SpellBaseDamageBonusDone().

◆ GetBaseSpellHealingBonus()

uint32 Player::GetBaseSpellHealingBonus ( )
inline
1970{ return m_baseSpellHealing; }

References m_baseSpellHealing.

Referenced by Unit::SpellBaseHealingBonusDone().

◆ GetBaseSpellPowerBonus()

uint32 Player::GetBaseSpellPowerBonus ( )
inline

◆ GetBaseWeaponSkillValue()

uint32 Player::GetBaseWeaponSkillValue ( WeaponAttackType  attType) const
12860{
12861 Item* item = GetWeaponForAttack(attType, true);
12862
12863 // unarmed only with base attack
12864 if (attType != BASE_ATTACK && !item)
12865 return 0;
12866
12867 // weapon skill or (unarmed for base attack)
12868 uint32 skill = item ? item->GetSkill() : uint32(SKILL_UNARMED);
12869 return GetBaseSkillValue(skill);
12870}
@ SKILL_UNARMED
Definition SharedDefines.h:3157

References BASE_ATTACK, GetBaseSkillValue(), Item::GetSkill(), GetWeaponForAttack(), and SKILL_UNARMED.

Referenced by UpdateCombatSkills().

◆ GetBattleground()

Battleground * Player::GetBattleground ( bool  create = false) const
12247{
12248 if (GetBattlegroundId() == 0)
12249 return nullptr;
12250
12252 return (create || (bg && bg->FindBgMap()) ? bg : nullptr);
12253}
#define sBattlegroundMgr
Definition BattlegroundMgr.h:187
BattlegroundMap * FindBgMap() const
Definition Battleground.h:441
BattlegroundTypeId GetBattlegroundTypeId() const
Definition Player.h:2259
uint32 GetBattlegroundId() const
Definition Player.h:2258

References Battleground::FindBgMap(), GetBattlegroundId(), GetBattlegroundTypeId(), and sBattlegroundMgr.

Referenced by GameObject::ActivateToQuest(), CanEquipItem(), Group::CanJoinBattlegroundQueue(), CanUnequipItem(), Spell::CheckCast(), MapInstanced::CreateInstanceForPlayer(), Object::DestroyForPlayer(), Spell::EffectOpenLock(), WorldSession::HandleAreaSpiritHealerQueryOpcode(), WorldSession::HandleAreaSpiritHealerQueueOpcode(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModEffectImmunity(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlegroundPlayerPositionsOpcode(), spell_item_rocket_boots::HandleDummy(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePVPLogDataOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), spell_ioc_gunship_portal::HandleScript2(), InArena(), SpellArea::IsFitToRequirements(), Unit::Kill(), LeaveBattleground(), AchievementCriteriaData::Meets(), Unit::Mount(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_arena_by_type::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_sa_defense_of_the_ancients::OnCheck(), achievement_not_even_a_scratch::OnCheck(), achievement_save_the_day::OnCheck(), go_arena_ready_marker::OnGossipHello(), RepopAtGraveyard(), ReportedAfkBy(), ResurrectPlayer(), RewardHonor(), SendInitWorldStates(), SendLoot(), SummonIfPossible(), AchievementMgr::UpdateAchievementCriteria(), and GameObject::Use().

◆ GetBattlegroundId()

uint32 Player::GetBattlegroundId ( ) const
inline

◆ GetBattlegroundQueueIndex()

◆ GetBattlegroundQueueTypeId()

BattlegroundQueueTypeId Player::GetBattlegroundQueueTypeId ( uint32  index) const

◆ GetBattlegroundTypeId()

BattlegroundTypeId Player::GetBattlegroundTypeId ( ) const
inline
2259{ return m_bgData.bgTypeID; }
BattlegroundTypeId bgTypeID
Definition Player.h:1031

References BGData::bgTypeID, and m_bgData.

Referenced by GetBattleground(), and ArenaSpectator::HandleSpectatorSpectateCommand().

◆ GetBGAccessByLevel()

bool Player::GetBGAccessByLevel ( BattlegroundTypeId  bgTypeId) const
12369{
12370 // get a template bg instead of running one
12371 Battleground* bgt = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
12372 if (!bgt)
12373 return false;
12374
12375 // limit check leel to dbc compatible level range
12376 uint32 level = GetLevel();
12377 if (level > DEFAULT_MAX_LEVEL)
12378 level = DEFAULT_MAX_LEVEL;
12379
12380 if (level < bgt->GetMinLevel() || level > bgt->GetMaxLevel())
12381 return false;
12382
12383 return true;
12384}
uint32 GetMaxLevel() const
Definition Battleground.h:330

References DEFAULT_MAX_LEVEL, Unit::GetLevel(), Battleground::GetMaxLevel(), and sBattlegroundMgr.

Referenced by Group::CanJoinBattlegroundQueue(), WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), and Creature::isCanInteractWithBattleMaster().

◆ GetBGData()

BGData & Player::GetBGData ( )
inline
2263{ return m_bgData; }

References m_bgData.

◆ GetBgTeamId()

◆ GetBonusTalentCount()

uint32 Player::GetBonusTalentCount ( )
inline
1730{ return m_extraBonusTalentCount; };

References m_extraBonusTalentCount.

◆ GetCastRequest()

const PendingSpellCastRequest * Player::GetCastRequest ( uint32  category) const
2313{
2314 for (const PendingSpellCastRequest& request : SpellQueue)
2315 if (request.category == category)
2316 return &request;
2317 return nullptr;
2318}
std::deque< PendingSpellCastRequest > SpellQueue
Definition Player.h:2653
Definition Player.h:1059

References SpellQueue.

Referenced by CanRequestSpellCast().

◆ GetChampioningFaction()

uint32 Player::GetChampioningFaction ( ) const
inline
2556{ return m_ChampioningFaction; }

References m_ChampioningFaction.

Referenced by RewardReputation().

◆ GetChatTag()

uint8 Player::GetChatTag ( ) const
1323{
1324 uint8 tag = CHAT_TAG_NONE;
1325
1326 if (isGMChat())
1327 tag |= CHAT_TAG_GM;
1328 if (isDND())
1329 tag |= CHAT_TAG_DND;
1330 if (isAFK())
1331 tag |= CHAT_TAG_AFK;
1332 if (IsCommentator())
1333 tag |= CHAT_TAG_COM;
1334 if (IsDeveloper())
1335 tag |= CHAT_TAG_DEV;
1336
1337 return tag;
1338}
@ CHAT_TAG_COM
Definition Player.h:844
@ CHAT_TAG_DND
Definition Player.h:842
@ CHAT_TAG_DEV
Definition Player.h:845
@ CHAT_TAG_AFK
Definition Player.h:841
@ CHAT_TAG_GM
Definition Player.h:843
@ CHAT_TAG_NONE
Definition Player.h:840
bool IsCommentator() const
Definition Player.h:1154
bool isGMChat() const
Definition Player.h:1163
bool isDND() const
Definition Player.h:1137
bool IsDeveloper() const
Definition Player.h:1156
bool isAFK() const
Definition Player.h:1136

References CHAT_TAG_AFK, CHAT_TAG_COM, CHAT_TAG_DEV, CHAT_TAG_DND, CHAT_TAG_GM, CHAT_TAG_NONE, isAFK(), IsCommentator(), IsDeveloper(), isDND(), and isGMChat().

◆ getCinematic()

uint8 Player::getCinematic ( ) const
inline
1827 {
1828 return m_cinematic;
1829 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ GetCinematicMgr()

CinematicMgr * Player::GetCinematicMgr ( ) const
inline

◆ GetCommandStatus()

◆ GetCorpse()

◆ GetCorpseLocation()

◆ GetCorpseReclaimDelay()

uint32 Player::GetCorpseReclaimDelay ( bool  pvp) const
12967{
12968 if (pvp)
12969 {
12970 if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP))
12971 return copseReclaimDelay[0];
12972 }
12973 else if (!sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE))
12974 return 0;
12975
12976 time_t now = GameTime::GetGameTime().count();
12977 // 0..2 full period
12978 // should be std::ceil(x)-1 but not floor(x)
12979 uint64 count = (now < m_deathExpireTime - 1) ? (m_deathExpireTime - 1 - now) / DEATH_EXPIRE_STEP : 0;
12980 return copseReclaimDelay[count];
12981}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, copseReclaimDelay, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, and sWorld.

Referenced by CalculateCorpseReclaimDelay(), and WorldSession::HandleReclaimCorpseOpcode().

◆ GetCreationTime()

Seconds Player::GetCreationTime ( ) const
inline
2543{ return m_creationTime; }

References m_creationTime.

◆ GetCurrentBattlegroundQueueSlot()

uint32 Player::GetCurrentBattlegroundQueueSlot ( ) const
inline

◆ GetCurrentRune()

RuneType Player::GetCurrentRune ( uint8  index) const
inline

◆ GetDeathTimer()

uint32 Player::GetDeathTimer ( ) const
inline
2176{ return m_deathTimer; }

References m_deathTimer.

Referenced by WorldSession::LogoutPlayer().

◆ GetDebugInfo()

std::string Player::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

16379{
16380 std::stringstream sstr;
16381 sstr << Unit::GetDebugInfo();
16382 return sstr.str();
16383}
std::string GetDebugInfo() const override
Definition Unit.cpp:21212

References Unit::GetDebugInfo().

◆ GetDeclinedNames()

DeclinedName const * Player::GetDeclinedNames ( ) const
inline
2508{ return m_declinedname; }

References m_declinedname.

Referenced by WorldSession::SendNameQueryOpcode().

◆ GetDefaultGossipMenuForSource()

uint32 Player::GetDefaultGossipMenuForSource ( WorldObject source)
static
423{
424 switch (source->GetTypeId())
425 {
426 case TYPEID_UNIT:
427 return source->ToCreature()->GetCreatureTemplate()->GossipMenuId;
429 return source->ToGameObject()->GetGOInfo()->GetGossipMenuId();
430 default:
431 break;
432 }
433
434 return 0;
435}
GameObjectTemplate const * GetGOInfo() const
Definition GameObject.h:136
uint32 GossipMenuId
Definition CreatureData.h:194
uint32 GetGossipMenuId() const
Definition GameObjectData.h:552

References Creature::GetCreatureTemplate(), GameObject::GetGOInfo(), GameObjectTemplate::GetGossipMenuId(), Object::GetTypeId(), CreatureTemplate::GossipMenuId, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GetGossipTextId(), and PrepareGossipMenu().

◆ GetDelayedOperations()

uint32 Player::GetDelayedOperations ( ) const
inline

◆ GetDifficulty()

◆ GetDivider()

◆ GetDodgeFromAgility()

void Player::GetDodgeFromAgility ( float &  diminishing,
float &  nondiminishing 
)
Todo:
: research if talents/effects that increase total agility by x% should increase non-diminishing part
5132{
5133 // Table for base dodge values
5134 const float dodge_base[MAX_CLASSES] =
5135 {
5136 0.036640f, // Warrior
5137 0.034943f, // Paladi
5138 -0.040873f, // Hunter
5139 0.020957f, // Rogue
5140 0.034178f, // Priest
5141 0.036640f, // DK
5142 0.021080f, // Shaman
5143 0.036587f, // Mage
5144 0.024211f, // Warlock
5145 0.0f, // ??
5146 0.056097f // Druid
5147 };
5148 // Crit/agility to dodge/agility coefficient multipliers; 3.2.0 increased required agility by 15%
5149 const float crit_to_dodge[MAX_CLASSES] =
5150 {
5151 0.85f / 1.15f, // Warrior
5152 1.00f / 1.15f, // Paladin
5153 1.11f / 1.15f, // Hunter
5154 2.00f / 1.15f, // Rogue
5155 1.00f / 1.15f, // Priest
5156 0.85f / 1.15f, // DK
5157 1.60f / 1.15f, // Shaman
5158 1.00f / 1.15f, // Mage
5159 0.97f / 1.15f, // Warlock (?)
5160 0.0f, // ??
5161 2.00f / 1.15f // Druid
5162 };
5163
5164 uint8 level = GetLevel();
5165 uint32 pclass = getClass();
5166
5167 if (level > GT_MAX_LEVEL)
5168 level = GT_MAX_LEVEL;
5169
5170 // Dodge per agility is proportional to crit per agility, which is available from DBC files
5171 GtChanceToMeleeCritEntry const* dodgeRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5172 if (!dodgeRatio || pclass > MAX_CLASSES)
5173 return;
5174
5177 float bonus_agility = GetStat(STAT_AGILITY) - base_agility;
5178
5179 // calculate diminishing (green in char screen) and non-diminishing (white) contribution
5180 diminishing = 100.0f * bonus_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1];
5181 nondiminishing = 100.0f * (dodge_base[pclass - 1] + base_agility * dodgeRatio->ratio * crit_to_dodge[pclass - 1]);
5182}
DBCStorage< GtChanceToMeleeCritEntry > sGtChanceToMeleeCritStore(GtChanceToMeleeCritfmt)
#define MAX_CLASSES
Definition SharedDefines.h:155
@ UNIT_MOD_STAT_START
Definition Unit.h:172
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition Unit.h:2135
float GetCreateStat(Stats stat) const
Definition Unit.h:1041
Definition DBCStructure.h:1058
float ratio
Definition DBCStructure.h:1059

References BASE_PCT, Unit::getClass(), Unit::GetCreateStat(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, Unit::m_auraModifiersGroup, MAX_CLASSES, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritStore, STAT_AGILITY, and UNIT_MOD_STAT_START.

Referenced by UpdateDodgePercentage().

◆ GetDrunkenstateByValue()

DrunkenState Player::GetDrunkenstateByValue ( uint8  value)
static
975{
976 if (value >= 90)
977 return DRUNKEN_SMASHED;
978 if (value >= 50)
979 return DRUNKEN_DRUNK;
980 if (value)
981 return DRUNKEN_TIPSY;
982 return DRUNKEN_SOBER;
983}
@ DRUNKEN_TIPSY
Definition Player.h:459
@ DRUNKEN_DRUNK
Definition Player.h:460
@ DRUNKEN_SOBER
Definition Player.h:458
@ DRUNKEN_SMASHED
Definition Player.h:461

References DRUNKEN_DRUNK, DRUNKEN_SMASHED, DRUNKEN_SOBER, and DRUNKEN_TIPSY.

Referenced by Condition::Meets(), AchievementCriteriaData::Meets(), and SetDrunkValue().

◆ GetDrunkValue()

◆ GetDungeonDifficulty()

◆ GetEntryPoint()

WorldLocation const & Player::GetEntryPoint ( ) const
inline

◆ GetExpertiseDodgeOrParryReduction()

float Player::GetExpertiseDodgeOrParryReduction ( WeaponAttackType  attType) const
5223{
5224 switch (attType)
5225 {
5226 case BASE_ATTACK:
5227 return m_Expertise / 4.0f;
5228 case OFF_ATTACK:
5229 return m_OffhandExpertise / 4.0f;
5230 default:
5231 break;
5232 }
5233 return 0.0f;
5234}
float m_OffhandExpertise
Definition Player.h:2892
float m_Expertise
Definition Player.h:2891

References BASE_ATTACK, m_Expertise, m_OffhandExpertise, and OFF_ATTACK.

◆ GetFakeDrunkValue()

int32 Player::GetFakeDrunkValue ( ) const
inline
@ PLAYER_FAKE_INEBRIATION
Definition UpdateFields.h:325
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:288

References Object::GetInt32Value(), and PLAYER_FAKE_INEBRIATION.

Referenced by UpdateInvisibilityDrunkDetect().

◆ GetFarSightDistance()

Optional< float > Player::GetFarSightDistance ( ) const
16296{
16297 return _farSightDistance;
16298}
Optional< float > _farSightDistance
Definition Player.h:3018

References _farSightDistance.

◆ GetFreeInventorySpace()

uint32 Player::GetFreeInventorySpace ( ) const
468{
469 uint32 freeSpace = 0;
470
471 // Check backpack
472 for (uint8 slot = INVENTORY_SLOT_ITEM_START; slot < INVENTORY_SLOT_ITEM_END; ++slot)
473 {
475 if (!item)
476 freeSpace += 1;
477 }
478
479 // Check bags
481 {
482 if (Bag* bag = GetBagByPos(i))
483 freeSpace += bag->GetFreeSlots();
484 }
485
486 return freeSpace;
487}

References GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and INVENTORY_SLOT_ITEM_START.

Referenced by Spell::CheckItems().

◆ GetFreePrimaryProfessionPoints()

uint32 Player::GetFreePrimaryProfessionPoints ( ) const
inline

◆ GetFreeTalentPoints()

uint32 Player::GetFreeTalentPoints ( ) const
inline
@ PLAYER_CHARACTER_POINTS1
Definition UpdateFields.h:342

References Object::GetUInt32Value(), and PLAYER_CHARACTER_POINTS1.

Referenced by BuildPlayerTalentsInfoData(), and LearnTalent().

◆ GetGameObjectIfCanInteractWith()

GameObject * Player::GetGameObjectIfCanInteractWith ( ObjectGuid const &  guid,
GameobjectTypes  type 
) const
2132{
2133 if (GameObject* go = GetMap()->GetGameObject(guid))
2134 {
2135 if (go->GetGoType() == type)
2136 {
2137 // Players cannot interact with gameobjects that use the "Point" icon
2138 if (go->GetGOInfo()->IconName == "Point")
2139 {
2140 return nullptr;
2141 }
2142
2143 if (go->IsWithinDistInMap(this))
2144 {
2145 return go;
2146 }
2147
2148 LOG_DEBUG("maps", "IsGameObjectOfTypeInRange: GameObject '{}' [{}] is too far away from player {} [{}] to be used by him (distance={}, maximal 10 is allowed)",
2149 go->GetGOInfo()->name, go->GetGUID().ToString(), GetName(), GetGUID().ToString(), go->GetDistance(this));
2150 }
2151 }
2152 return nullptr;
2153}
GameObject * GetGameObject(uint32 spellId) const
Definition Unit.cpp:6268

References Unit::GetGameObject(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetName(), LOG_DEBUG, and Position::ToString().

Referenced by CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), and WorldSession::HandleGuildBankerActivate().

◆ GetGlobalCooldownMgr()

GlobalCooldownMgr & Player::GetGlobalCooldownMgr ( )
inline

◆ GetGlyph()

◆ GetGlyphSlot()

uint32 Player::GetGlyphSlot ( uint8  slot) const
inline
@ PLAYER_FIELD_GLYPH_SLOTS_1
Definition UpdateFields.h:388

References Object::GetUInt32Value(), and PLAYER_FIELD_GLYPH_SLOTS_1.

Referenced by _LoadGlyphAuras(), and Spell::EffectApplyGlyph().

◆ GetGossipTextId() [1/2]

uint32 Player::GetGossipTextId ( uint32  menuId,
WorldObject source 
)
405{
407
408 if (!menuId)
409 return textId;
410
411 GossipMenusMapBounds menuBounds = sObjectMgr->GetGossipMenusMapBounds(menuId);
412
413 for (GossipMenusContainer::const_iterator itr = menuBounds.first; itr != menuBounds.second; ++itr)
414 {
415 if (sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
416 textId = itr->second.TextID;
417 }
418
419 return textId;
420}
#define DEFAULT_GOSSIP_MESSAGE
Definition GossipDef.h:31

References DEFAULT_GOSSIP_MESSAGE, sConditionMgr, and sObjectMgr.

Referenced by GetGossipTextId(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), boss_gloomrel::OnGossipHello(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_zulaman_hostage::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_high_overlord_saurfang_icc::OnGossipHello(), npc_muradin_bronzebeard_icc::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_drake_dealer_hurlunk::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_zephyr::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_engineering_tele_trinket::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_sayge::OnGossipHello(), npc_wormhole::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_experience::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), icecrown_citadel_teleport::OnGossipHello(), npc_prof_blacksmith::SendActionMenu(), npc_prof_alchemy::SendConfirmLearn(), npc_prof_blacksmith::SendConfirmLearn(), npc_prof_tailor::SendConfirmLearn(), go_evil_book_for_dummies::SendConfirmLearn(), npc_prof_alchemy::SendConfirmUnlearn(), npc_prof_blacksmith::SendConfirmUnlearn(), npc_prof_tailor::SendConfirmUnlearn(), go_evil_book_for_dummies::SendConfirmUnlearn(), SendPreparedGossip(), SendPreparedQuest(), npc_echo_of_medivh::sGossipHello(), and npc_chesspiece::sGossipHello().

◆ GetGossipTextId() [2/2]

uint32 Player::GetGossipTextId ( WorldObject source)
397{
398 if (!source)
400
401 return GetGossipTextId(GetDefaultGossipMenuForSource(source), source);
402}
static uint32 GetDefaultGossipMenuForSource(WorldObject *source)
Definition PlayerGossip.cpp:422
uint32 GetGossipTextId(uint32 menuId, WorldObject *source)
Definition PlayerGossip.cpp:404

References DEFAULT_GOSSIP_MESSAGE, GetDefaultGossipMenuForSource(), and GetGossipTextId().

◆ GetGracePeriod()

uint32 Player::GetGracePeriod ( uint8  index) const
inline
2513{ return m_runes->runes[index].GracePeriod; }
uint32 GracePeriod
Definition Player.h:417

References RuneInfo::GracePeriod, m_runes, and Runes::runes.

Referenced by GetRuneBaseCooldown(), and RegenerateAll().

◆ GetGrantableLevels()

uint8 Player::GetGrantableLevels ( )
inline

◆ GetGroup() [1/2]

Group * Player::GetGroup ( )
inline
2472{ return m_group.getTarget(); }
GroupReference m_group
Definition Player.h:2910
TO * getTarget() const
Definition Reference.h:95

References Reference< TO, FROM >::getTarget(), and m_group.

Referenced by _LoadGroup(), Group::AddInvite(), Loot::AddItem(), Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Battleground::AddOrSetPlayerToCorrectBgGroup(), Arena::AddPlayer(), InstanceMap::AddPlayerToMap(), LootItem::AllowedForPlayer(), Group::BroadcastPacket(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), InstanceMap::CannotEnter(), CanRollForItemInLFG(), CanUninviteFromGroup(), Spell::CheckCast(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), CheckInstanceLoginValid(), MapInstanced::CreateInstance(), MapInstanced::CreateInstanceForPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), ArenaTeam::DelMember(), Group::Disband(), WorldSession::DoLootRelease(), DoRandomRoll(), SmartAI::EndPath(), Loot::FillLoot(), GetNextRandomRaidMember(), Unit::GetNextRandomRaidMemberOrPet(), Unit::GetPartyMembers(), ChatHandler::GetPlayerGroupAndGUIDByName(), GetsRecruitAFriendBonus(), GroupEventHappens(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), Unit::HandleAuraRaidProcFromChargeWithValue(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), Unit::HandleDummyAuraProc(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupAssistantLeaderOpcode(), WorldSession::HandleGroupChangeSubGroupOpcode(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupInviteOpcode(), group_commandscript::HandleGroupJoinCommand(), WorldSession::HandleGroupRaidConvertOpcode(), group_commandscript::HandleGroupReviveCommand(), WorldSession::HandleGroupSetLeaderOpcode(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleGroupSwapSubGroupOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::HandleInstanceLockResponse(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), WorldSession::HandleLfgLeaveOpcode(), WorldSession::HandleLfgPartyLockInfoRequestOpcode(), WorldSession::HandleLfgSetRolesOpcode(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandleLootMethodOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMinimapPingOpcode(), WorldSession::HandlePartyAssignmentOpcode(), WorldSession::HandlePetRename(), Battlefield::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleRaidReadyCheckFinishedOpcode(), WorldSession::HandleRaidReadyCheckOpcode(), WorldSession::HandleRaidTargetUpdateOpcode(), WorldSession::HandleResetInstancesOpcode(), spell_q12805_lifeblood_dummy::HandleScript(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), misc_commandscript::HandleSummonCommand(), tele_commandscript::HandleTeleGroupCommand(), HasQuestForGO(), HasQuestForItem(), isAllowedToLoot(), SmartAI::IsEscortInvokerInRange(), Unit::IsInPartyWith(), IsInSameGroupWith(), IsInSameRaidWith(), GameObject::IsLootAllowedFor(), Creature::isTappedBy(), lfg::LFGMgr::JoinLfg(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), npc_coren_direbrew::JustDied(), boss_headless_horseman::JustDied(), boss_ahune::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), Unit::Kill(), KilledMonsterCredit(), KilledPlayerCredit(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), lfg::LFGMgr::MakeNewGroup(), npc_icc_buff_switcher::OnGossipSelect(), lfg::LFGPlayerScript::OnPlayerBindToInstance(), lfg::LFGPlayerScript::OnPlayerLevelChanged(), lfg::LFGPlayerScript::OnPlayerLogin(), lfg::LFGPlayerScript::OnPlayerLogout(), lfg::LFGPlayerScript::OnPlayerMapChanged(), Acore::MostHPMissingGroupInRange::operator()(), InstanceMap::PermBindAllPlayers(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerGetDestinationInstanceId(), ProcessDelayedOperations(), RemoveFromGroup(), RemovePet(), RewardPlayerAndGroupAtEvent(), Group::SameSubGroup(), Satisfy(), SendInitialPacketsAfterAddToMap(), SendLoot(), SendNewItem(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), SendUpdateToOutOfRangeGroupMembers(), Group::SendUpdateToPlayer(), SetBattlegroundOrBattlefieldRaid(), Unit::SetHealth(), Creature::SetLootRecipient(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), Unit::setPowerType(), StoreLootItem(), lfg::LFGMgr::TeleportPlayer(), PetAI::UpdateAllies(), Unit::UpdateAuraForGroup(), UpdatePosition(), lfg::LFGMgr::UpdateRaidBrowser(), UpdateZone(), and GameObject::Use().

◆ GetGroup() [2/2]

const Group * Player::GetGroup ( ) const
inline
2473{ return (const Group*)m_group.getTarget(); }

References Reference< TO, FROM >::getTarget(), and m_group.

◆ GetGroupInvite()

◆ GetGroupRef()

GroupReference & Player::GetGroupRef ( )
inline
2474{ return m_group; }

References m_group.

◆ GetGroupUpdateFlag()

uint32 Player::GetGroupUpdateFlag ( ) const
inline

◆ GetGuild()

Guild * Player::GetGuild ( ) const
16021{
16022 uint32 guildId = GetGuildId();
16023 return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
16024}

References GetGuildId(), and sGuildMgr.

Referenced by GiveLevel(), WorldSession::HandleGuildBankerActivate(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleGuildRankOpcode(), Guild::HandleInviteMember(), and UpdateZone().

◆ GetGuildId()

◆ GetGuildIdInvited()

◆ GetGuildName()

std::string const & Player::GetGuildName ( )
15462{
15463 return sGuildMgr->GetGuildById(GetGuildId())->GetName();
15464}

References GetGuildId(), and sGuildMgr.

◆ GetHealthBonusFromStamina()

float Player::GetHealthBonusFromStamina ( )
294{
295 float stamina = GetStat(STAT_STAMINA);
296
297 float baseStam = stamina < 20 ? stamina : 20;
298 float moreStam = stamina - baseStam;
299
300 return baseStam + (moreStam * 10.0f);
301}

References Unit::GetStat(), and STAT_STAMINA.

Referenced by UpdateMaxHealth().

◆ GetHonorPoints()

◆ GetInGameTime()

uint32 Player::GetInGameTime ( )
inline
1549{ return m_ingametime; }

References m_ingametime.

◆ GetInitialVisiblePackets()

void Player::GetInitialVisiblePackets ( Unit target)
1693{
1694 GetAurasForTarget(target);
1695 if (target->IsAlive())
1696 {
1698 target->GetVictim())
1699 target->SendMeleeAttackStart(target->GetVictim(), this);
1700 }
1701}
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
void GetAurasForTarget(Unit *target, bool force=false)
Definition Player.cpp:12110
Unit * GetVictim() const
Definition Unit.h:886
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3098

References GetAurasForTarget(), Unit::GetVictim(), Unit::HasUnitState(), Unit::IsAlive(), Unit::SendMeleeAttackStart(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by Acore::VisibleNotifier::SendToSelf(), and UpdateVisibilityOf().

◆ GetInnTriggerId()

uint32 Player::GetInnTriggerId ( ) const
inline
1206{ return _innTriggerId; }

References _innTriggerId.

Referenced by Update().

◆ GetItemByEntry()

Item * Player::GetItemByEntry ( uint32  entry) const
3369{
3370 // in inventory
3372 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3373 if (pItem->GetEntry() == entry)
3374 return pItem;
3375
3377 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3378 if (pItem->GetEntry() == entry)
3379 return pItem;
3380
3381 for (int i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
3382 if (Bag* pBag = GetBagByPos(i))
3383 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
3384 if (Item* pItem = pBag->GetItemByPos(j))
3385 if (pItem->GetEntry() == entry)
3386 return pItem;
3387
3388 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
3389 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
3390 if (pItem->GetEntry() == entry)
3391 return pItem;
3392
3393 return nullptr;
3394}

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, and KEYRING_SLOT_START.

Referenced by Spell::CheckItems(), Spell::EffectRechargeManaGem(), and Spell::EffectStuck().

◆ GetItemByGuid()

Item * Player::GetItemByGuid ( ObjectGuid  guid) const
409{
411 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
412 if (pItem->GetGUID() == guid)
413 return pItem;
414
416 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
417 if (pItem->GetGUID() == guid)
418 return pItem;
419
420 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
421 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
422 if (pItem->GetGUID() == guid)
423 return pItem;
424
426 if (Bag* pBag = GetBagByPos(i))
427 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
428 if (Item* pItem = pBag->GetItemByPos(j))
429 if (pItem->GetGUID() == guid)
430 return pItem;
431
433 if (Bag* pBag = GetBagByPos(i))
434 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
435 if (Item* pItem = pBag->GetItemByPos(j))
436 if (pItem->GetGUID() == guid)
437 return pItem;
438
439 return nullptr;
440}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by _SaveInventory(), Spell::CheckCast(), WorldSession::DoLootRelease(), TradeData::GetItem(), TradeData::GetSpellCastItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleAutostoreLootItemOpcode(), debug_commandscript::HandleDebugGetItemValueCommand(), debug_commandscript::HandleDebugItemExpireCommand(), debug_commandscript::HandleDebugSetItemValueCommand(), Unit::HandleDummyAuraProc(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleItemRefund(), WorldSession::HandleItemRefundInfoRequest(), WorldSession::HandleItemTextQuery(), WorldSession::HandleLootMoneyOpcode(), Unit::HandleOverrideClassScriptAuraProc(), WorldSession::HandlePetitionRenameOpcode(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleSocketOpcode(), WorldSession::HandleTurnInPetitionOpcode(), SendLoot(), SpellCastTargets::Update(), and Spell::UpdatePointers().

◆ GetItemByPos() [1/2]

Item * Player::GetItemByPos ( uint16  pos) const
443{
444 uint8 bag = pos >> 8;
445 uint8 slot = pos & 255;
446 return GetItemByPos(bag, slot);
447}

References GetItemByPos().

Referenced by _SaveCharacter(), _SaveInventory(), _StoreItem(), AutoUnequipOffhandIfNeed(), BuildEnchantmentsInfoData(), CanEquipItem(), CanStoreItem_InBag(), CanStoreItem_InInventorySlots(), CanStoreItem_InSpecificSlot(), CanStoreItems(), CanUnequipItem(), CanUnequipItems(), CastAllObtainSpells(), CastItemCombatSpell(), CorrectMetaGemEnchants(), Create(), DestroyConjuredItems(), DestroyItem(), DestroyItemCount(), DestroyZoneLimitedItem(), DurabilityLossAll(), DurabilityPointLossForEquipSlot(), DurabilityPointsLossAll(), DurabilityRepair(), Spell::EffectDurabilityDamage(), Spell::EffectDurabilityDamagePCT(), Spell::EffectEnchantHeldItem(), EnchantmentFitsRequirements(), EquipItem(), EquippedOk(), FindEquipSlot(), GetBagByPos(), GetFreeInventorySpace(), GetItemByEntry(), GetItemByGuid(), GetItemByPos(), GetItemCount(), GetItemCountWithLimitCategory(), GetShield(), GetUseableItemByPos(), GetWeaponForAttack(), misc_commandscript::HandleAddItemCommand(), spell_rog_deadly_poison::HandleAfterHit(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModShapeshift(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), bg_commandscript::HandleBagsClearCommand(), WorldSession::HandleCancelTempEnchantmentOpcode(), character_commandscript::HandleCharacterCheckBagCommand(), debug_commandscript::HandleDebugGetItemStateCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetSave(), WorldSession::HandleEquipmentSetUse(), inventory_commandscript::HandleInventoryCountCommand(), WorldSession::HandleMirrorImageDataRequest(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleReadItem(), WorldSession::HandleSetTradeItemOpcode(), WorldSession::HandleWrapItemOpcode(), HasItemCount(), HasItemOrGemWithIdEquipped(), HasItemOrGemWithLimitCategoryEquipped(), HasItemTotemCategory(), IsTwoHandUsed(), MoveItemFromInventory(), RemoveArenaEnchantments(), RemoveItem(), reset_commandscript::ResetItemsDeleteBankBags(), reset_commandscript::ResetItemsDeleteStandardBags(), reset_commandscript::ResetItemsEquipped(), reset_commandscript::ResetItemsInBags(), reset_commandscript::ResetItemsInBank(), reset_commandscript::ResetItemsInCurrenciesList(), reset_commandscript::ResetItemsInKeyring(), SplitItem(), SwapItem(), and ToggleMetaGemsActive().

◆ GetItemByPos() [2/2]

Item * Player::GetItemByPos ( uint8  bag,
uint8  slot 
) const
450{
451 if (bag == INVENTORY_SLOT_BAG_0 && (slot < BANK_SLOT_BAG_END || (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END)))
452 return m_items[slot];
453 else if (Bag* pBag = GetBagByPos(bag))
454 return pBag->GetItemByPos(slot);
455 return nullptr;
456}

References BANK_SLOT_BAG_END, CURRENCYTOKEN_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, KEYRING_SLOT_START, and m_items.

◆ GetItemCount()

uint32 Player::GetItemCount ( uint32  item,
bool  inBankAlso = false,
Item skipItem = nullptr 
) const
329{
330 uint32 count = 0;
332 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
333 if (pItem != skipItem && pItem->GetEntry() == item)
334 count += pItem->GetCount();
335
337 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
338 if (pItem != skipItem && pItem->GetEntry() == item)
339 count += pItem->GetCount();
340
342 if (Bag* pBag = GetBagByPos(i))
343 count += pBag->GetItemCount(item, skipItem);
344
345 if (skipItem && skipItem->GetTemplate()->GemProperties)
347 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
348 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
349 count += pItem->GetGemCountWithID(item);
350
351 if (inBankAlso)
352 {
353 // checking every item from 39 to 74 (including bank bags)
355 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
356 if (pItem != skipItem && pItem->GetEntry() == item)
357 count += pItem->GetCount();
358
360 if (Bag* pBag = GetBagByPos(i))
361 count += pBag->GetItemCount(item, skipItem);
362
363 if (skipItem && skipItem->GetTemplate()->GemProperties)
365 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
366 if (pItem != skipItem && pItem->GetTemplate()->Socket[0].Color)
367 count += pItem->GetGemCountWithID(item);
368 }
369
370 return count;
371}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, _Socket::Color, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, KEYRING_SLOT_START, and ItemTemplate::Socket.

Referenced by AdjustQuestReqItemCount(), CanRewardQuest(), CanRollOnItem(), CanTakeMoreSimilarItems(), WorldSession::HandleSetAmmoOpcode(), HasQuestForItem(), npc_venomhide_hatchling::npc_venomhide_hatchlingAI::IsSummonedBy(), ItemRemovedQuestCheck(), npc_adventurous_dwarf::OnGossipHello(), SendNewItem(), and PlayerMenu::SendQuestGiverRequestItems().

◆ GetItemCountWithLimitCategory()

uint32 Player::GetItemCountWithLimitCategory ( uint32  limitCategory,
Item skipItem = nullptr 
) const
374{
375 uint32 count = 0;
376 for (int i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i)
377 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
378 if (pItem != skipItem)
379 if (ItemTemplate const* pProto = pItem->GetTemplate())
380 if (pProto->ItemLimitCategory == limitCategory)
381 count += pItem->GetCount();
382
383 for (int i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
384 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
385 if (pItem != skipItem)
386 if (ItemTemplate const* pProto = pItem->GetTemplate())
387 if (pProto->ItemLimitCategory == limitCategory)
388 count += pItem->GetCount();
389
391 if (Bag* pBag = GetBagByPos(i))
392 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
393
394 for (int i = BANK_SLOT_ITEM_START; i < BANK_SLOT_BAG_END; ++i)
395 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
396 if (pItem != skipItem)
397 if (ItemTemplate const* pProto = pItem->GetTemplate())
398 if (pProto->ItemLimitCategory == limitCategory)
399 count += pItem->GetCount();
400
401 for (int i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
402 if (Bag* pBag = GetBagByPos(i))
403 count += pBag->GetItemCountWithLimitCategory(limitCategory, skipItem);
404
405 return count;
406}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, and KEYRING_SLOT_START.

Referenced by CanTakeMoreSimilarItems().

◆ GetItemFromBuyBackSlot()

Item * Player::GetItemFromBuyBackSlot ( uint32  slot)
3987{
3988 LOG_DEBUG("entities.player.items", "STORAGE: GetItemFromBuyBackSlot slot = {}", slot);
3989 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
3990 return m_items[slot];
3991 return nullptr;
3992}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, LOG_DEBUG, and m_items.

Referenced by WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ GetItemUpdateQueue()

std::vector< Item * > & Player::GetItemUpdateQueue ( )
inline

◆ GetLastPetNumber()

uint32 Player::GetLastPetNumber ( ) const
inline
2461{ return m_lastpetnumber; }

References m_lastpetnumber.

Referenced by spell_gen_pet_summoned::HandleScript().

◆ GetLastPetSpell()

uint32 Player::GetLastPetSpell ( ) const
inline

◆ GetLastPotionId()

uint32 Player::GetLastPotionId ( )
inline
1807{ return m_lastPotionId; }

References m_lastPotionId.

Referenced by Spell::CheckCast(), and UpdatePotionCooldown().

◆ GetLastUsedRune()

RuneType Player::GetLastUsedRune ( )
inline
2516{ return m_runes->lastUsedRune; }
RuneType lastUsedRune
Definition Player.h:425

References Runes::lastUsedRune, and m_runes.

◆ GetLevelPlayedTime()

uint32 Player::GetLevelPlayedTime ( )
inline

◆ GetLootGUID()

◆ GetMail()

Mail * Player::GetMail ( uint32  id)
3818{
3819 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
3820 {
3821 if ((*itr)->messageID == id)
3822 {
3823 return (*itr);
3824 }
3825 }
3826 return nullptr;
3827}

References m_mail.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailMarkAsRead(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), and WorldSession::HandleMailTakeMoney().

◆ GetMails()

PlayerMails const & Player::GetMails ( ) const
inline

◆ GetMailSize()

uint32 Player::GetMailSize ( )
inline
1644{ return m_mail.size();}

References m_mail.

Referenced by _SaveMail(), and WorldSession::HandleSendMail().

◆ GetManaBonusFromIntellect()

float Player::GetManaBonusFromIntellect ( )
304{
305 float intellect = GetStat(STAT_INTELLECT);
306
307 float baseInt = intellect < 20 ? intellect : 20;
308 float moreInt = intellect - baseInt;
309
310 return baseInt + (moreInt * 15.0f);
311}

References Unit::GetStat(), and STAT_INTELLECT.

Referenced by UpdateMaxPower().

◆ GetMapChangeOrderCounter()

uint32 Player::GetMapChangeOrderCounter ( )
inline
2643{ return _mapChangeOrderCounter; }
uint32 _mapChangeOrderCounter
Definition Player.h:3028

References _mapChangeOrderCounter.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetMapRef()

MapReference & Player::GetMapRef ( )
inline
2495{ return m_mapRef; }
MapReference m_mapRef
Definition Player.h:2965

References m_mapRef.

Referenced by InstanceMap::CannotEnter(), BattlegroundMap::CannotEnter(), ResetMap(), and Map::UpdateIteratorBack().

◆ GetMaxKeyringSize()

uint32 Player::GetMaxKeyringSize ( ) const
inline

◆ GetMaxPersonalArenaRatingRequirement()

uint32 Player::GetMaxPersonalArenaRatingRequirement ( uint32  minarenaslot) const

If trans is specified, arena point save query will be added to trans.

10907{
10908 // returns the maximal personal arena rating that can be used to purchase items requiring this condition
10909 // the personal rating of the arena team must match the required limit as well
10910 // so return max[in arenateams](min(personalrating[teamtype], teamrating[teamtype]))
10911 uint32 max_personal_rating = 0;
10912 for (uint8 i = minarenaslot; i < MAX_ARENA_SLOT; ++i)
10913 {
10914 if (ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(GetArenaTeamId(i)))
10915 {
10916 uint32 p_rating = GetArenaPersonalRating(i);
10917 uint32 t_rating = at->GetRating();
10918 p_rating = p_rating < t_rating ? p_rating : t_rating;
10919 if (max_personal_rating < p_rating)
10920 max_personal_rating = p_rating;
10921 }
10922 }
10923
10924 sScriptMgr->OnPlayerGetMaxPersonalArenaRatingRequirement(this, minarenaslot, max_personal_rating);
10925
10926 return max_personal_rating;
10927}
uint32 GetArenaPersonalRating(uint8 slot) const
Definition Player.cpp:16217
uint32 GetArenaTeamId(uint8 slot) const
Definition Player.cpp:16226

References GetArenaPersonalRating(), GetArenaTeamId(), MAX_ARENA_SLOT, sArenaTeamMgr, and sScriptMgr.

Referenced by BuyItemFromVendorSlot().

◆ GetMaxSkillValue()

uint16 Player::GetMaxSkillValue ( uint32  skill) const
5487{
5488 if (!skill)
5489 return 0;
5490
5491 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5492 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5493 return 0;
5494
5495 uint32 bonus = GetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos));
5496
5497 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5498 sScriptMgr->OnPlayerGetMaxSkillValue(const_cast<Player*>(this), skill, result, false);
5499 result += SKILL_TEMP_BONUS(bonus);
5500 result += SKILL_PERM_BONUS(bonus);
5501 return result < 0 ? 0 : result;
5502}
#define SKILL_TEMP_BONUS(x)
Definition Player.h:87

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, SKILL_PERM_BONUS, SKILL_TEMP_BONUS, and sScriptMgr.

Referenced by Unit::GetDefenseSkillValue(), and UpdateFishingSkill().

◆ GetMaxSkillValueForLevel()

uint16 Player::GetMaxSkillValueForLevel ( ) const
16254{
16256
16257 sScriptMgr->OnPlayerGetMaxSkillValueForLevel(const_cast<Player*>(this), result);
16258
16259 return result;
16260}
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1171

References Unit::GetMaxSkillValueForLevel(), and sScriptMgr.

Referenced by _addSpell(), _LoadSkills(), GetMissPercentageFromDefence(), LearnDefaultSkill(), removeSpell(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDodgePercentage(), UpdateParryPercentage(), and UpdateSkillsForLevel().

◆ getMaxTimer()

int32 Player::getMaxTimer ( MirrorTimerType  timer)
protected
822{
823 switch (timer)
824 {
825 case FATIGUE_TIMER:
826 return MINUTE * IN_MILLISECONDS;
827 case BREATH_TIMER:
828 {
831 int32 UnderWaterTime = sWorld->getIntConfig(CONFIG_WATER_BREATH_TIMER);
833 for (AuraEffectList::const_iterator i = mModWaterBreathing.begin(); i != mModWaterBreathing.end(); ++i)
834 AddPct(UnderWaterTime, (*i)->GetAmount());
835 return UnderWaterTime;
836 }
837 case FIRE_TIMER:
838 {
839 if (!IsAlive())
841 return 2020;
842 }
843 default:
844 return 0;
845 }
846}
AccountTypes
Definition Common.h:56
@ FIRE_TIMER
Definition Player.h:570
@ FATIGUE_TIMER
Definition Player.h:568
@ BREATH_TIMER
Definition Player.h:569
@ SPELL_AURA_MOD_WATER_BREATHING
Definition SpellAuraDefines.h:218
@ CONFIG_WATER_BREATH_TIMER
Definition WorldConfig.h:378
@ CONFIG_DISABLE_BREATHING
Definition WorldConfig.h:259
bool HasWaterBreathingAura() const
Definition Unit.h:1766

References AddPct(), BREATH_TIMER, CONFIG_DISABLE_BREATHING, CONFIG_WATER_BREATH_TIMER, DISABLED_MIRROR_TIMER, FATIGUE_TIMER, FIRE_TIMER, Unit::GetAuraEffectsByType(), GetSession(), Unit::HasWaterBreathingAura(), IN_MILLISECONDS, Unit::IsAlive(), MINUTE, SPELL_AURA_MOD_WATER_BREATHING, and sWorld.

Referenced by HandleDrowning(), and IsMirrorTimerActive().

◆ GetMeleeCritFromAgility()

float Player::GetMeleeCritFromAgility ( )
5115{
5116 uint8 level = GetLevel();
5117 uint32 pclass = getClass();
5118
5119 if (level > GT_MAX_LEVEL)
5120 level = GT_MAX_LEVEL;
5121
5122 GtChanceToMeleeCritBaseEntry const* critBase = sGtChanceToMeleeCritBaseStore.LookupEntry(pclass - 1);
5123 GtChanceToMeleeCritEntry const* critRatio = sGtChanceToMeleeCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5124 if (!critBase || !critRatio)
5125 return 0.0f;
5126
5127 float crit = critBase->base + GetStat(STAT_AGILITY) * critRatio->ratio;
5128 return crit * 100.0f;
5129}
DBCStorage< GtChanceToMeleeCritBaseEntry > sGtChanceToMeleeCritBaseStore(GtChanceToMeleeCritBasefmt)
Definition DBCStructure.h:1053
float base
Definition DBCStructure.h:1054

References GtChanceToMeleeCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToMeleeCritEntry::ratio, sGtChanceToMeleeCritBaseStore, sGtChanceToMeleeCritStore, and STAT_AGILITY.

Referenced by UpdateAllCritPercentages().

◆ GetMeleeDamageSchoolMask()

SpellSchoolMask Player::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
overridevirtual

Implements Unit.

7062{
7063 if (Item const* weapon = GetWeaponForAttack(attackType, true))
7064 {
7065 return SpellSchoolMask(1 << weapon->GetTemplate()->Damage[damageIndex].DamageType);
7066 }
7067
7069}
SpellSchoolMask
Definition SharedDefines.h:306

References GetWeaponForAttack(), and SPELL_SCHOOL_MASK_NORMAL.

◆ GetMissPercentageFromDefence()

float Player::GetMissPercentageFromDefence ( ) const
726{
727 float const miss_cap[MAX_CLASSES] =
728 {
729 16.00f, // Warrior //correct
730 16.00f, // Paladin //correct
731 16.00f, // Hunter //?
732 16.00f, // Rogue //?
733 16.00f, // Priest //?
734 16.00f, // DK //correct
735 16.00f, // Shaman //?
736 16.00f, // Mage //?
737 16.00f, // Warlock //?
738 0.0f, // ??
739 16.00f // Druid //?
740 };
741
742 float diminishing = 0.0f, nondiminishing = 0.0f;
743 // Modify value from defense skill (only bonus from defense rating diminishes)
744 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
745 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
746
747 // apply diminishing formula to diminishing miss chance
748 uint32 pclass = getClass() - 1;
749 return nondiminishing + (diminishing * miss_cap[pclass] / (diminishing + miss_cap[pclass] * m_diminishing_k[pclass]));
750}
const float m_diminishing_k[MAX_CLASSES]
Definition StatSystem.cpp:710
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5217

References CR_DEFENSE_SKILL, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), m_diminishing_k, MAX_CLASSES, and SKILL_DEFENSE.

◆ GetMItem()

Item * Player::GetMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1663 {
1664 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
1665 return itr != mMitems.end() ? itr->second : nullptr;
1666 }

References mMitems.

Referenced by WorldSession::HandleGetMailList(), WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ GetMoney()

◆ GetMostPointsTalentTree()

uint8 Player::GetMostPointsTalentTree ( ) const
15421{
15422 uint32 specPoints[3] = {0, 0, 0};
15423 const PlayerTalentMap& talentMap = GetTalentMap();
15424 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15425 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15426 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15427 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15428 if (tab->tabpage < 3)
15429 {
15430 // find current talent rank
15431 uint8 currentTalentRank = 0;
15432 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15433 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15434 {
15435 currentTalentRank = rank + 1;
15436 break;
15437 }
15438 specPoints[tab->tabpage] += currentTalentRank;
15439 }
15440 uint8 maxIndex = 0;
15441 uint8 maxCount = specPoints[0];
15442 for (uint8 i = 1; i < 3; ++i)
15443 if (specPoints[i] > maxCount)
15444 {
15445 maxIndex = i;
15446 maxCount = specPoints[i];
15447 }
15448 return maxIndex;
15449}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

◆ GetMountBlockId()

uint32 Player::GetMountBlockId ( )
inline

◆ GetNextQuest()

Quest const * Player::GetNextQuest ( ObjectGuid  guid,
Quest const *  quest 
)
208{
209 QuestRelationBounds objectQR;
210
212 if (creature)
213 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
214 else
215 {
216 //we should obtain map pointer from GetMap() in 99% of cases. Special case
217 //only for quests which cast teleport spells on player
219 ASSERT(_map);
220 GameObject* pGameObject = _map->GetGameObject(guid);
221 if (pGameObject)
222 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
223 else
224 return nullptr;
225 }
226
227 uint32 nextQuestID = quest->GetNextQuestInChain();
228 for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr)
229 {
230 if (itr->second == nextQuestID)
231 return sObjectMgr->GetQuestTemplate(nextQuestID);
232 }
233
234 return nullptr;
235}
std::pair< QuestRelations::const_iterator, QuestRelations::const_iterator > QuestRelationBounds
Definition ObjectMgr.h:525
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const &)
Definition ObjectAccessor.cpp:234

References ASSERT, ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), Quest::GetNextQuestInChain(), Object::IsInWorld(), sMapMgr, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ GetNextRandomRaidMember()

Player * Player::GetNextRandomRaidMember ( float  radius)
13032{
13033 Group* group = GetGroup();
13034 if (!group)
13035 return nullptr;
13036
13037 std::vector<Player*> nearMembers;
13038 nearMembers.reserve(group->GetMembersCount());
13039
13040 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
13041 {
13042 Player* Target = itr->GetSource();
13043
13044 // IsHostileTo check duel and controlled by enemy
13045 if (Target && Target != this && IsWithinDistInMap(Target, radius) &&
13046 !Target->HasInvisibilityAura() && !IsHostileTo(Target))
13047 nearMembers.push_back(Target);
13048 }
13049
13050 if (nearMembers.empty())
13051 return nullptr;
13052
13053 uint32 randTarget = urand(0, nearMembers.size() - 1);
13054 return nearMembers[randTarget];
13055}
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10287

References Group::GetFirstMember(), GetGroup(), Group::GetMembersCount(), Unit::HasInvisibilityAura(), Unit::IsHostileTo(), WorldObject::IsWithinDistInMap(), and urand().

◆ GetNextSave()

uint32 Player::GetNextSave ( ) const
inline
2611{ return m_nextSave; }

References m_nextSave.

◆ GetNPCIfCanInteractWith()

Creature * Player::GetNPCIfCanInteractWith ( ObjectGuid const &  guid,
uint32  npcflagmask 
)
2075{
2076 // unit checks
2077 if (!guid)
2078 return nullptr;
2079
2080 if (!IsInWorld())
2081 return nullptr;
2082
2083 if (IsInFlight())
2084 return nullptr;
2085
2086 // exist (we need look pets also for some interaction (quest/etc)
2087 Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid);
2088 if (!creature)
2089 return nullptr;
2090
2091 // Deathstate checks
2093 return nullptr;
2094
2095 // alive or spirit healer
2097 return nullptr;
2098
2099 // appropriate npc type
2100 if (npcflagmask && !creature->HasNpcFlag(NPCFlags(npcflagmask)))
2101 return nullptr;
2102
2103 // not allow interaction under control, but allow with own pets
2104 if (creature->GetCharmerGUID())
2105 return nullptr;
2106
2107 // xinef: perform better check
2108 if (creature->GetReactionTo(this) <= REP_UNFRIENDLY)
2109 return nullptr;
2110
2111 // xinef: not needed, CORRECTLY checked above including forced reputations etc
2112 // not unfriendly
2113 //if (FactionTemplateEntry const* factionTemplate = sFactionTemplateStore.LookupEntry(creature->GetFaction()))
2114 // if (factionTemplate->faction)
2115 // if (FactionEntry const* faction = sFactionStore.LookupEntry(factionTemplate->faction))
2116 // if (faction->reputationListID >= 0 && GetReputationMgr().GetRank(faction) <= REP_UNFRIENDLY)
2117 // return nullptr;
2118
2119 // not too far
2120 if (!creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
2121 return nullptr;
2122
2123 // pussywizard: many npcs have missing conditions for class training and rogue trainer can for eg. train dual wield to a shaman :/ too many to change in sql and watch in the future
2124 // pussywizard: this function is not used when talking, but when already taking action (buy spell, reset talents, show spell list)
2126 return nullptr;
2127
2128 return creature;
2129}
#define INTERACTION_DISTANCE
Definition ObjectDefines.h:24
Classes
Definition SharedDefines.h:139
@ REP_UNFRIENDLY
Definition SharedDefines.h:182
@ TRAINER_TYPE_CLASS
Definition SharedDefines.h:2628
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
Definition SharedDefines.h:2707
@ CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD
Definition SharedDefines.h:2713
@ CLASS_CONTEXT_CLASS_TRAINER
Definition UnitDefines.h:247
NPCFlags
Non Player Character flags.
Definition UnitDefines.h:317
@ UNIT_NPC_FLAG_TRAINER_CLASS
Definition UnitDefines.h:324
@ UNIT_NPC_FLAG_TRAINER
Definition UnitDefines.h:323
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10115
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:748
ObjectGuid GetCharmerGUID() const
Definition Unit.h:704
uint32 trainer_class
Definition CreatureData.h:220
uint32 type_flags
Definition CreatureData.h:223
uint32 trainer_type
Definition CreatureData.h:218

References CLASS_CONTEXT_CLASS_TRAINER, CREATURE_TYPE_FLAG_INTERACT_WHILE_DEAD, CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS, Unit::GetCharmerGUID(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Creature::GetCreatureTemplate(), Unit::GetReactionTo(), Unit::HasNpcFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), IsClass(), Unit::IsInFlight(), Object::IsInWorld(), WorldObject::IsWithinDistInMap(), REP_UNFRIENDLY, CreatureTemplate::trainer_class, CreatureTemplate::trainer_type, TRAINER_TYPE_CLASS, CreatureTemplate::type_flags, UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_TRAINER_CLASS.

Referenced by BuyItemFromVendorSlot(), CanInteractWithQuestGiver(), WorldSession::CanOpenMailBox(), WorldSession::CanUseBank(), WorldSession::HandleActivateTaxiExpressOpcode(), WorldSession::HandleActivateTaxiOpcode(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::SendListInventory(), WorldSession::SendPetitionShowList(), and WorldSession::SendTrainerList().

◆ GetOriginalGroup()

◆ GetOriginalGroupRef()

GroupReference & Player::GetOriginalGroupRef ( )
inline
2488{ return m_originalGroup; }

References m_originalGroup.

◆ GetOriginalSubGroup()

uint8 Player::GetOriginalSubGroup ( ) const
inline
2489{ return m_originalGroup.getSubGroup(); }
uint8 getSubGroup() const
Definition GroupReference.h:38

References GroupReference::getSubGroup(), and m_originalGroup.

Referenced by RemoveFromBattlegroundOrBattlefieldRaid().

◆ GetOrInitPetStable()

PetStable & Player::GetOrInitPetStable ( )
15701{
15702 if (!m_petStable)
15703 m_petStable = std::make_unique<PetStable>();
15704
15705 return *m_petStable;
15706}

References m_petStable.

Referenced by WorldSession::HandleBuyStableSlot(), Unit::InitTamedPet(), and SummonPet().

◆ GetOutdoorPvP()

OutdoorPvP * Player::GetOutdoorPvP ( ) const
12564{
12565 return sOutdoorPvPMgr->GetOutdoorPvPToZoneId(GetZoneId());
12566}
#define sOutdoorPvPMgr
Definition OutdoorPvPMgr.h:102

References WorldObject::GetZoneId(), and sOutdoorPvPMgr.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Unit::Kill().

◆ GetPassOnGroupLoot()

bool Player::GetPassOnGroupLoot ( ) const
inline
2493{ return m_bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by Group::GroupLoot(), and Group::NeedBeforeGreed().

◆ GetPendingBind()

uint32 Player::GetPendingBind ( ) const
inline
2444{ return _pendingBindId; }

References _pendingBindId.

Referenced by WorldSession::HandleInstanceLockResponse().

◆ GetPendingFlightChange()

uint32 Player::GetPendingFlightChange ( ) const
inline

◆ GetPendingSpectatorInviteInstanceId()

uint32 Player::GetPendingSpectatorInviteInstanceId ( ) const
inline

◆ GetPet()

Pet * Player::GetPet ( ) const
8978{
8979 if (ObjectGuid pet_guid = GetPetGUID())
8980 {
8981 if (!pet_guid.IsPet())
8982 return nullptr;
8983
8984 Pet* pet = ObjectAccessor::GetPet(*this, pet_guid);
8985
8986 if (!pet)
8987 return nullptr;
8988
8989 if (IsInWorld())
8990 return pet;
8991
8992 //there may be a guardian in slot
8993 //LOG_ERROR("entities.player", "Player::GetPet: Pet {} not exist.", pet_guid.ToString());
8994 //const_cast<Player*>(this)->SetPetGUID(0);
8995 }
8996
8997 return nullptr;
8998}
Pet * GetPet(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:215

References ObjectAccessor::GetPet(), Unit::GetPetGUID(), and Object::IsInWorld().

Referenced by Spell::_cast(), KillRewarder::_RewardXP(), ActivateSpec(), Battleground::AddPlayer(), AuraEffect::ApplySpellMod(), WorldSession::BuildPartyMemberStatsChangedPacket(), BuildPetTalentsInfoData(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), Unit::DealDamage(), spell_hun_masters_call::DoCheckCast(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::EffectFeedPet(), Spell::EffectResurrectPet(), Spell::EffectSummonPet(), GiveLevel(), AuraEffect::HandleAuraModPetTalentsPoints(), spell_hun_masters_call::HandleDummy(), learn_commandscript::HandleLearnAllMyPetTalentsCommand(), AuraEffect::HandleModPossessPet(), WorldSession::HandleMoveTeleportAck(), pet_commandscript::HandlePetLearnCommand(), pet_commandscript::HandlePetUnlearnCommand(), Unit::HandleProcTriggerSpell(), WorldSession::HandleRequestPartyMemberStatsOpcode(), WorldSession::HandleRequestPetInfo(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), InitStatsForLevel(), Unit::Kill(), LearnPetTalent(), Pet::LoadPetFromDB(), go_orb_of_domination::OnGossipHello(), PetSpellInitialize(), PrepareGossipMenu(), RemoveArenaSpellCooldowns(), RemovePet(), ResetPetTalents(), SaveToDB(), SendUpdateToOutOfRangeGroupMembers(), SetGameMaster(), Unit::SetSpeed(), TeleportTo(), UnsummonPetTemporaryIfAny(), and Update().

◆ GetPetStable() [1/2]

◆ GetPetStable() [2/2]

PetStable const * Player::GetPetStable ( ) const
inline
1210{ return m_petStable.get(); }

References m_petStable.

◆ GetPhaseMaskForSpawn()

uint32 Player::GetPhaseMaskForSpawn ( ) const
13823{
13825
13826 if (!phase)
13828
13829 // some aura phases include 1 normal map in addition to phase itself
13830 uint32 n_phase = phase & ~PHASEMASK_NORMAL;
13831 if (n_phase > 0)
13832 return n_phase;
13833
13834 return phase;
13835}
@ PHASEMASK_NORMAL
Definition Object.h:62
phase
Definition boss_skadi.cpp:99
uint32 GetPhaseByAuras() const
Definition Unit.cpp:19069
uint32 GetPhaseMask() const
Definition Object.h:513

References Unit::GetPhaseByAuras(), WorldObject::GetPhaseMask(), IsGameMaster(), and PHASEMASK_NORMAL.

Referenced by gobject_commandscript::HandleGameObjectAddCommand(), npc_commandscript::HandleNpcAddCommand(), wp_commandscript::HandleWpModifyCommand(), and wp_commandscript::HandleWpShowCommand().

◆ GetPlayerFlags()

PlayerFlags Player::GetPlayerFlags ( ) const
inline
PlayerFlags
Definition Player.h:467
@ PLAYER_FLAGS
Definition UpdateFields.h:178

References Object::GetUInt32Value(), and PLAYER_FLAGS.

Referenced by _SaveCharacter().

◆ GetPlayerName()

std::string Player::GetPlayerName ( )
16324{
16325 std::string name = GetName();
16326 std::string color = "";
16327
16328 switch (getClass())
16329 {
16330 case CLASS_DEATH_KNIGHT: color = "|cffC41F3B"; break;
16331 case CLASS_DRUID: color = "|cffFF7D0A"; break;
16332 case CLASS_HUNTER: color = "|cffABD473"; break;
16333 case CLASS_MAGE: color = "|cff69CCF0"; break;
16334 case CLASS_PALADIN: color = "|cffF58CBA"; break;
16335 case CLASS_PRIEST: color = "|cffFFFFFF"; break;
16336 case CLASS_ROGUE: color = "|cffFFF569"; break;
16337 case CLASS_SHAMAN: color = "|cff0070DE"; break;
16338 case CLASS_WARLOCK: color = "|cff9482C9"; break;
16339 case CLASS_WARRIOR: color = "|cffC79C6E"; break;
16340 }
16341
16342 return "|Hplayer:" + name + "|h" + color + name + "|h|r";
16343}
@ CLASS_PRIEST
Definition SharedDefines.h:145

References CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, Unit::getClass(), and WorldObject::GetName().

Referenced by gear_commandscript::HandleGearStatsCommand().

◆ GetPlayerSetting()

PlayerSetting Player::GetPlayerSetting ( std::string const &  source,
uint32  index 
)
133{
134 auto it = m_charSettingsMap.find(source);
135 if (it == m_charSettingsMap.end() || static_cast<size_t>(index) >= it->second.size())
136 {
137 UpdatePlayerSetting(source, index, 0);
138 return m_charSettingsMap[source][index];
139 }
140
141 return it->second[index];
142}
void UpdatePlayerSetting(std::string const &source, uint32 index, uint32 value)
Definition PlayerSettings.cpp:159

References m_charSettingsMap, and UpdatePlayerSetting().

Referenced by player_settings_commandscript::HandleSettingsAnnouncerFlags(), and ChatHandler::SendWorldTextOptional().

◆ GetPureMaxSkillValue()

uint16 Player::GetPureMaxSkillValue ( uint32  skill) const
5505{
5506 if (!skill)
5507 return 0;
5508
5509 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5510 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5511 return 0;
5512
5513 int32 result = int32(SKILL_MAX(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos))));
5514
5515 sScriptMgr->OnPlayerGetMaxSkillValue(const_cast<Player*>(this), skill, result, true);
5516
5517 return result < 0 ? 0 : result;
5518}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_VALUE_INDEX, SKILL_DELETED, SKILL_MAX, and sScriptMgr.

Referenced by _addSpell(), learn_commandscript::HandleLearnAllRecipesCommand(), lookup_commandscript::HandleLookupSkillCommand(), misc_commandscript::HandleSetSkillCommand(), and removeSpell().

◆ GetPureSkillValue()

uint16 Player::GetPureSkillValue ( uint32  skill) const

◆ GetQuestDialogStatus()

QuestGiverStatus Player::GetQuestDialogStatus ( Object questGiver)
1596{
1599
1600 sScriptMgr->GetDialogStatus(this, questgiver);
1601
1602 switch (questgiver->GetTypeId())
1603 {
1604 case TYPEID_GAMEOBJECT:
1605 {
1606 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToGameObject()));
1607 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1608 return questStatus;
1609 qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry());
1610 qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry());
1611 break;
1612 }
1613 case TYPEID_UNIT:
1614 {
1615 QuestGiverStatus questStatus = QuestGiverStatus(sScriptMgr->GetDialogStatus(this, questgiver->ToCreature()));
1616 if (questStatus != DIALOG_STATUS_SCRIPTED_NO_STATUS)
1617 return questStatus;
1618 qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry());
1619 qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry());
1620 break;
1621 }
1622 default:
1623 // it's impossible, but check
1624 //LOG_ERROR("entities.player.quest", "GetQuestDialogStatus called for unexpected type {}", questgiver->GetTypeId());
1625 return DIALOG_STATUS_NONE;
1626 }
1627
1629
1630 for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
1631 {
1633 uint32 questId = i->second;
1634 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1635 if (!quest)
1636 continue;
1637
1638 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1639 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1640 continue;
1641
1642 QuestStatus status = GetQuestStatus(questId);
1643 if (status == QUEST_STATUS_COMPLETE && !GetQuestRewardStatus(questId))
1644 {
1645 result2 = DIALOG_STATUS_REWARD;
1646 }
1647 else if (status == QUEST_STATUS_INCOMPLETE)
1648 {
1649 result2 = DIALOG_STATUS_INCOMPLETE;
1650 }
1651
1652 if (quest->IsAutoComplete() && CanTakeQuest(quest, false) && quest->IsRepeatable() && !quest->IsDailyOrWeekly())
1653 {
1654 result2 = DIALOG_STATUS_REWARD_REP;
1655 }
1656
1657 if (result2 > result)
1658 {
1659 result = result2;
1660 }
1661 }
1662
1663 for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i)
1664 {
1666 uint32 questId = i->second;
1667 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1668 if (!quest)
1669 continue;
1670
1671 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, quest->GetQuestId());
1672 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1673 continue;
1674
1675 QuestStatus status = GetQuestStatus(questId);
1676 if (status == QUEST_STATUS_NONE)
1677 {
1678 if (CanSeeStartQuest(quest))
1679 {
1680 if (SatisfyQuestLevel(quest, false))
1681 {
1682 bool isNotLowLevelQuest = GetLevel() <= (GetQuestLevel(quest) + sWorld->getIntConfig(CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF));
1683
1684 if (quest->IsRepeatable())
1685 {
1686 if (quest->IsDaily())
1687 {
1688 if (isNotLowLevelQuest)
1689 {
1691 }
1692 else
1693 {
1695 }
1696 }
1697 else if (quest->IsWeekly() || quest->IsMonthly())
1698 {
1699 if (isNotLowLevelQuest)
1700 {
1701 result2 = DIALOG_STATUS_AVAILABLE;
1702 }
1703 else
1704 {
1706 }
1707 }
1708 else if (quest->IsAutoComplete())
1709 {
1710 if (isNotLowLevelQuest)
1711 {
1712 result2 = DIALOG_STATUS_REWARD_REP;
1713 }
1714 else
1715 {
1717 }
1718 }
1719 else
1720 {
1721 if (isNotLowLevelQuest)
1722 {
1723 result2 = DIALOG_STATUS_REWARD_REP;
1724 }
1725 else
1726 {
1728 }
1729 }
1730 }
1731 else
1732 {
1733 result2 = isNotLowLevelQuest ? DIALOG_STATUS_AVAILABLE : DIALOG_STATUS_LOW_LEVEL_AVAILABLE;
1734 }
1735 }
1736 else
1737 {
1738 result2 = DIALOG_STATUS_UNAVAILABLE;
1739 }
1740 }
1741 }
1742
1743 if (result2 > result)
1744 result = result2;
1745 }
1746
1747 return result;
1748}
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition ConditionMgr.h:143
QuestGiverStatus
Definition QuestDef.h:111
@ DIALOG_STATUS_UNAVAILABLE
Definition QuestDef.h:113
@ DIALOG_STATUS_NONE
Definition QuestDef.h:112
@ DIALOG_STATUS_AVAILABLE
Definition QuestDef.h:120
@ DIALOG_STATUS_SCRIPTED_NO_STATUS
Definition QuestDef.h:125
@ DIALOG_STATUS_LOW_LEVEL_REWARD_REP
Definition QuestDef.h:115
@ DIALOG_STATUS_REWARD
Definition QuestDef.h:122
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE
Definition QuestDef.h:114
@ DIALOG_STATUS_REWARD_REP
Definition QuestDef.h:118
@ DIALOG_STATUS_INCOMPLETE
Definition QuestDef.h:117
@ DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP
Definition QuestDef.h:116
@ DIALOG_STATUS_AVAILABLE_REP
Definition QuestDef.h:119
@ CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF
Definition WorldConfig.h:239
int32 GetQuestLevel(Quest const *quest) const
Definition Player.h:1422
bool CanSeeStartQuest(Quest const *quest)
Definition PlayerQuest.cpp:237
uint32 GetQuestId() const
Definition QuestDef.h:228
bool IsDaily() const
Definition QuestDef.h:287
bool IsWeekly() const
Definition QuestDef.h:288
bool IsDailyOrWeekly() const
Definition QuestDef.h:291
bool IsMonthly() const
Definition QuestDef.h:289

References CanSeeStartQuest(), CanTakeQuest(), CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, CONFIG_QUEST_LOW_LEVEL_HIDE_DIFF, DIALOG_STATUS_AVAILABLE, DIALOG_STATUS_AVAILABLE_REP, DIALOG_STATUS_INCOMPLETE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE, DIALOG_STATUS_LOW_LEVEL_AVAILABLE_REP, DIALOG_STATUS_LOW_LEVEL_REWARD_REP, DIALOG_STATUS_NONE, DIALOG_STATUS_REWARD, DIALOG_STATUS_REWARD_REP, DIALOG_STATUS_SCRIPTED_NO_STATUS, DIALOG_STATUS_UNAVAILABLE, Object::GetEntry(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), GetQuestRewardStatus(), GetQuestStatus(), Object::GetTypeId(), Quest::IsAutoComplete(), Quest::IsDaily(), Quest::IsDailyOrWeekly(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, SatisfyQuestLevel(), sConditionMgr, sObjectMgr, sScriptMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), TYPEID_GAMEOBJECT, and TYPEID_UNIT.

Referenced by GameObject::ActivateToQuest(), WorldSession::HandleQuestgiverChooseRewardOpcode(), and WorldSession::HandleQuestgiverStatusQueryOpcode().

◆ GetQuestLevel()

int32 Player::GetQuestLevel ( Quest const *  quest) const
inline

◆ GetQuestRate()

float Player::GetQuestRate ( bool  isDFQuest = false)
16263{
16264 float result = isDFQuest ? sWorld->getRate(RATE_XP_QUEST_DF) : sWorld->getRate(RATE_XP_QUEST);
16265
16266 sScriptMgr->OnPlayerGetQuestRate(this, result);
16267
16268 return result;
16269}
@ RATE_XP_QUEST_DF
Definition WorldConfig.h:434
@ RATE_XP_QUEST
Definition WorldConfig.h:433

References RATE_XP_QUEST, RATE_XP_QUEST_DF, sScriptMgr, and sWorld.

Referenced by CalculateQuestRewardXP().

◆ GetQuestRewardStatus()

◆ GetQuestSlotCounter()

uint16 Player::GetQuestSlotCounter ( uint16  slot,
uint8  counter 
) const
inline
1484{ return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
@ QUEST_COUNTS_OFFSET
Definition Player.h:619
#define MAX_QUEST_OFFSET
Definition Player.h:623
@ PLAYER_QUEST_LOG_1_1
Definition UpdateFields.h:186

References Object::GetUInt64Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and QUEST_COUNTS_OFFSET.

Referenced by SendQuestUpdateAddCreatureOrGo(), and SendQuestUpdateAddPlayer().

◆ GetQuestSlotQuestId()

◆ GetQuestSlotState()

uint32 Player::GetQuestSlotState ( uint16  slot) const
inline

◆ GetQuestSlotTime()

uint32 Player::GetQuestSlotTime ( uint16  slot) const
inline

◆ GetQuestStatus()

QuestStatus Player::GetQuestStatus ( uint32  quest_id) const
1431{
1432 if (quest_id)
1433 {
1434 QuestStatusMap::const_iterator itr = m_QuestStatus.find(quest_id);
1435
1436 if (itr != m_QuestStatus.end())
1437 {
1438 return itr->second.Status;
1439 }
1440
1441 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id))
1442 {
1443 if (qInfo->IsSeasonal())
1444 {
1446 }
1447
1448 if (!qInfo->IsRepeatable() && IsQuestRewarded(quest_id))
1449 {
1450 return QUEST_STATUS_REWARDED;
1451 }
1452 }
1453 }
1454
1455 return QUEST_STATUS_NONE;
1456}
@ QUEST_STATUS_REWARDED
Definition QuestDef.h:106

References IsQuestRewarded(), m_QuestStatus, QUEST_STATUS_NONE, QUEST_STATUS_REWARDED, SatisfyQuestSeasonal(), and sObjectMgr.

Referenced by GameObject::ActivateToQuest(), LootItem::AllowedForPlayer(), CanRewardQuest(), ServerMailCondition::CheckCondition(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::CheckEventFail(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), spell_item_demon_broiled_surprise::CheckRequirement(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), DuelComplete(), Spell::EffectQuestClear(), Spell::EffectScriptEffect(), SmartAI::EndPath(), FailQuest(), npc_wg_quest_giver::GetDialogStatus(), GetQuestDialogStatus(), go_gilded_brazier::go_gilded_brazierAI::GossipHello(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), WorldSession::HandleAreaTriggerOpcode(), spell_midsummer_torch_catch::HandleDummy(), spell_q12014_steady_as_a_rock::HandleFinish(), spell_sindragosa_frost_breath::HandleInfusion(), lookup_commandscript::HandleLookupQuestCommand(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverRequestRewardOpcode(), spell_q11322_q11317_the_cleansing::if(), SpellArea::IsFitToRequirements(), npc_overlord_drakuru_betrayal::IsPlayerOnQuest(), npc_kservant::npc_kservantAI::IsSummonedBy(), npc_clintar_spirit::npc_clintar_spiritAI::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_alar::JustDied(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), spell_chapter2_persuasive_strike::Load(), npc_a_special_surprise::npc_a_special_surpriseAI::MeetQuestCondition(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), npc_black_knight_graveyard::npc_black_knight_graveyardAI::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), npc_death_knight_initiate::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_great_bear_spirit::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_plucky::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_iruk::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_adventurous_dwarf::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_tele_to_violet_stand::OnGossipHello(), go_ravager_cage::OnGossipHello(), go_bristlelimb_cage::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_skull_pile::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_table_theka::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_amberpine_outhouse::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_great_bear_spirit::OnGossipSelect(), at_ancient_leaf::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), at_malfurion_stormrage::OnTrigger(), at_commander_dawnforge::OnTrigger(), item_captured_frog::OnUse(), npc_doctor::npc_doctorAI::PatientDied(), npc_doctor::npc_doctorAI::PatientSaved(), PrepareQuestMenu(), NPCStaveQuestAI::QuestIncomplete(), npc_shenthul::npc_shenthulAI::ReceiveEmote(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), SatisfyQuestExclusiveGroup(), SatisfyQuestNextChain(), SatisfyQuestPreviousQuest(), SatisfyQuestStatus(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::SetBossState(), npc_costumed_orphan_matron::sGossipHello(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::sGossipSelect(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), Battleground::SpiritOfCompetitionEvent(), npc_clintar_spirit::npc_clintar_spiritAI::StartEvent(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), and GameObject::Use().

◆ getQuestStatusMap()

◆ GetQuestStatusSaveMap()

QuestStatusSaveMap & Player::GetQuestStatusSaveMap ( )
inline
1622{ return m_QuestStatusSave; }

References m_QuestStatusSave.

◆ GetRaidDifficulty()

◆ GetRandomWinner()

bool Player::GetRandomWinner ( )
inline

◆ GetRank()

uint8 Player::GetRank ( ) const
inline

◆ GetRatingBonusValue()

◆ GetRatingMultiplier()

float Player::GetRatingMultiplier ( CombatRating  cr) const
5202{
5203 uint8 level = GetLevel();
5204
5205 if (level > GT_MAX_LEVEL)
5206 level = GT_MAX_LEVEL;
5207
5208 GtCombatRatingsEntry const* Rating = sGtCombatRatingsStore.LookupEntry(cr * GT_MAX_LEVEL + level - 1);
5209 // gtOCTClassCombatRatingScalarStore.dbc starts with 1, CombatRating with zero, so cr+1
5210 GtOCTClassCombatRatingScalarEntry const* classRating = sGtOCTClassCombatRatingScalarStore.LookupEntry((getClass() - 1) * GT_MAX_RATING + cr + 1);
5211 if (!Rating || !classRating)
5212 return 1.0f; // By default use minimum coefficient (not must be called)
5213
5214 return classRating->ratio / Rating->ratio;
5215}
DBCStorage< GtCombatRatingsEntry > sGtCombatRatingsStore(GtCombatRatingsfmt)
DBCStorage< GtOCTClassCombatRatingScalarEntry > sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt)
#define GT_MAX_RATING
Definition DBCStructure.h:1040
Definition DBCStructure.h:1048
float ratio
Definition DBCStructure.h:1049
Definition DBCStructure.h:1078
float ratio
Definition DBCStructure.h:1079

References Unit::getClass(), Unit::GetLevel(), GT_MAX_LEVEL, GT_MAX_RATING, GtCombatRatingsEntry::ratio, GtOCTClassCombatRatingScalarEntry::ratio, sGtCombatRatingsStore, and sGtOCTClassCombatRatingScalarStore.

Referenced by ApplyRatingMod(), and GetRatingBonusValue().

◆ GetRealDodge()

float Player::GetRealDodge ( ) const
inline
2608{ return m_realDodge; }

References m_realDodge.

Referenced by Unit::GetUnitDodgeChance().

◆ GetRealParry()

float Player::GetRealParry ( ) const
inline
2607{ return m_realParry; }

References m_realParry.

◆ GetReputation()

uint32 Player::GetReputation ( uint32  factionentry) const
15457{
15458 return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
15459}
int32 GetReputation(uint32 faction_id) const
Definition ReputationMgr.cpp:78

References ReputationMgr::GetReputation(), GetReputationMgr(), and sFactionStore.

Referenced by CanCompleteQuest(), ReputationChanged(), ReputationChanged2(), and SatisfyQuestReputation().

◆ GetReputationMgr() [1/2]

◆ GetReputationMgr() [2/2]

ReputationMgr const & Player::GetReputationMgr ( ) const
inline
2126{ return *m_reputationMgr; }

References m_reputationMgr.

◆ GetReputationPriceDiscount() [1/2]

◆ GetReputationPriceDiscount() [2/2]

float Player::GetReputationPriceDiscount ( FactionTemplateEntry const *  factionTemplate) const
12392{
12393 if (!factionTemplate || !factionTemplate->faction)
12394 {
12395 return 1.0f;
12396 }
12397
12398 ReputationRank rank = GetReputationRank(factionTemplate->faction);
12399 if (rank <= REP_NEUTRAL)
12400 {
12401 return 1.0f;
12402 }
12403
12404 return 1.0f - 0.05f * (rank - REP_NEUTRAL);
12405}
ReputationRank
Definition SharedDefines.h:179
@ REP_NEUTRAL
Definition SharedDefines.h:183

References FactionTemplateEntry::faction, GetReputationRank(), and REP_NEUTRAL.

◆ GetReputationRank()

◆ GetReqKillOrCastCurrentCount()

uint16 Player::GetReqKillOrCastCurrentCount ( uint32  quest_id,
int32  entry 
)
1752{
1753 Quest const* qInfo = sObjectMgr->GetQuestTemplate(quest_id);
1754 if (!qInfo)
1755 return 0;
1756
1757 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1758 if (qInfo->RequiredNpcOrGo[j] == entry)
1759 return m_QuestStatus[quest_id].CreatureOrGOCount[j];
1760
1761 return 0;
1762}

References m_QuestStatus, QUEST_OBJECTIVES_COUNT, Quest::RequiredNpcOrGo, and sObjectMgr.

Referenced by npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), and npc_razael_and_lyana::OnGossipHello().

◆ GetRestBonus()

float Player::GetRestBonus ( ) const
inline
1200{ return _restBonus; }

References _restBonus.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ GetResurrectionSpellId()

uint32 Player::GetResurrectionSpellId ( )
12663{
12664 // search priceless resurrection possibilities
12665 uint32 prio = 0;
12666 uint32 spell_id = 0;
12668 for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
12669 {
12670 // Soulstone Resurrection // prio: 3 (max, non death persistent)
12671 if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92)
12672 {
12673 switch ((*itr)->GetId())
12674 {
12675 case 20707:
12676 spell_id = 3026;
12677 break; // rank 1
12678 case 20762:
12679 spell_id = 20758;
12680 break; // rank 2
12681 case 20763:
12682 spell_id = 20759;
12683 break; // rank 3
12684 case 20764:
12685 spell_id = 20760;
12686 break; // rank 4
12687 case 20765:
12688 spell_id = 20761;
12689 break; // rank 5
12690 case 27239:
12691 spell_id = 27240;
12692 break; // rank 6
12693 case 47883:
12694 spell_id = 47882;
12695 break; // rank 7
12696 default:
12697 LOG_ERROR("entities.player", "Unhandled spell {}: S.Resurrection", (*itr)->GetId());
12698 continue;
12699 }
12700
12701 prio = 3;
12702 }
12703 // Twisting Nether // prio: 2 (max)
12704 else if ((*itr)->GetId() == 23701 && roll_chance_i(10))
12705 {
12706 prio = 2;
12707 spell_id = 23700;
12708 }
12709 }
12710
12711 // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life
12712 if (prio < 1 && HasSpell(20608) && !HasSpellCooldown(21169) && (HasAura(58059) || HasItemCount(17030)))
12713 spell_id = 21169;
12714
12715 return spell_id;
12716}
bool roll_chance_i(int chance)
Definition Random.h:63
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References Unit::GetAuraEffectsByType(), Unit::HasAura(), HasItemCount(), HasSpell(), HasSpellCooldown(), LOG_ERROR, roll_chance_i(), and SPELL_AURA_DUMMY.

Referenced by Unit::Kill(), and setDeathState().

◆ GetRewardedQuestCount()

std::size_t Player::GetRewardedQuestCount ( ) const
inline
1624{ return m_RewardedQuests.size(); }

References m_RewardedQuests.

Referenced by WorldSession::HandleQueryQuestsCompleted().

◆ getRewardedQuests()

RewardedQuestSet const & Player::getRewardedQuests ( ) const
inline

◆ GetRuneBaseCooldown()

uint32 Player::GetRuneBaseCooldown ( uint8  index,
bool  skipGrace 
)
13417{
13418 uint8 rune = GetBaseRune(index);
13419 uint32 cooldown = RUNE_BASE_COOLDOWN;
13420 if (!skipGrace)
13421 cooldown -= GetGracePeriod(index) < 250 ? 0 : GetGracePeriod(index) - 250; // xinef: reduce by grace period, treat first 250ms as instant use of rune
13422
13424 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
13425 {
13426 if ((*i)->GetMiscValue() == POWER_RUNE && (*i)->GetMiscValueB() == rune)
13427 cooldown = cooldown * (100 - (*i)->GetAmount()) / 100;
13428 }
13429
13430 return cooldown;
13431}
@ RUNE_BASE_COOLDOWN
Definition Player.h:398
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
Definition SpellAuraDefines.h:173
uint32 GetGracePeriod(uint8 index) const
Definition Player.h:2513
RuneType GetBaseRune(uint8 index) const
Definition Player.h:2510

References Unit::GetAuraEffectsByType(), GetBaseRune(), GetGracePeriod(), POWER_RUNE, RUNE_BASE_COOLDOWN, and SPELL_AURA_MOD_POWER_REGEN_PERCENT.

Referenced by Spell::TakeRunePower(), and UpdateRuneRegen().

◆ GetRuneCooldown()

uint32 Player::GetRuneCooldown ( uint8  index) const
inline

◆ GetRunesState()

uint8 Player::GetRunesState ( ) const
inline
2509{ return m_runes->runeState; }
uint8 runeState
Definition Player.h:424

References m_runes, and Runes::runeState.

Referenced by Spell::EffectActivateRune(), and Spell::TakeRunePower().

◆ getRuneWeaponGUID()

ObjectGuid Player::getRuneWeaponGUID ( )
inline
2593{ return m_drwGUID; };
ObjectGuid m_drwGUID
Definition Player.h:2594

References m_drwGUID.

◆ GetSaveTimer()

uint32 Player::GetSaveTimer ( ) const
inline
2360{ return m_nextSave; }

References m_nextSave.

Referenced by misc_commandscript::HandleSaveCommand().

◆ GetSeer()

WorldObject * Player::GetSeer ( ) const
inline
2354{ return m_seer; }

References m_seer.

◆ GetSelectedPlayer()

Player * Player::GetSelectedPlayer ( ) const
11558{
11559 if (ObjectGuid selectionGUID = GetGuidValue(UNIT_FIELD_TARGET))
11560 return ObjectAccessor::GetPlayer(*this, selectionGUID);
11561
11562 return nullptr;
11563}
@ UNIT_FIELD_TARGET
Definition UpdateFields.h:92
Player * GetPlayer(Map const *, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:220

References Object::GetGuidValue(), ObjectAccessor::GetPlayer(), and UNIT_FIELD_TARGET.

Referenced by Acore::ChatCommands::PlayerIdentifier::FromTarget().

◆ GetSelectedUnit()

◆ GetSemaphoreTeleportFar()

time_t Player::GetSemaphoreTeleportFar ( ) const
inline
2096{ return mSemaphoreTeleport_Far; }

References mSemaphoreTeleport_Far.

◆ GetSemaphoreTeleportNear()

time_t Player::GetSemaphoreTeleportNear ( ) const
inline
2095{ return mSemaphoreTeleport_Near; }

References mSemaphoreTeleport_Near.

◆ GetSession()

WorldSession * Player::GetSession ( ) const
inline
1998{ return m_session; }

References m_session.

Referenced by _addSpell(), _LoadHomeBind(), _LoadInventory(), Battleground::_ProcessProgress(), _SaveCharacter(), _SaveInstanceTimeRestrictions(), ActivateSpec(), ActivateTaxiPathTo(), AddEnchantmentDuration(), AddItem(), Guild::AddMember(), InstanceMap::AddPlayerToMap(), Channel::Announce(), Battlefield::AskToLeaveQueue(), AutoUnequipOffhandIfNeed(), BanMgr::BanCharacter(), SocialMgr::BroadcastToFriendListers(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), WorldSession::CanOpenMailBox(), CanSpeak(), BattlegroundSA::CaptureGraveyard(), CharacterActionIpLogger::CharacterIPLogAction(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::CheckRequiredBosses(), AchievementMgr::CompletedAchievement(), ContinueTaxiFlight(), Create(), Guild::Create(), ArenaTeam::DelMember(), InstanceScript::DoSendNotifyToInstance(), DuelComplete(), DurabilityRepair(), Spell::EffectApplyGlyph(), Spell::EffectDiscoverTaxi(), Spell::EffectPlaySound(), BattlegroundSA::EventPlayerDamagedGO(), ExecuteOrCancelSpellCastRequest(), lfg::LFGMgr::FinishDungeon(), Channel::FlagsNotify(), SocialMgr::GetFriendInfo(), getMaxTimer(), GetsRecruitAFriendBonus(), GiveLevel(), Group::GroupLoot(), WorldSession::HandleAcceptGrantLevel(), WorldSession::HandleAcceptTradeOpcode(), account_commandscript::HandleAccountSetAddonCommand(), account_commandscript::HandleAccountSetGmLevelCommand(), WorldSession::HandleAddFriendOpcode(), misc_commandscript::HandleAddItemCommand(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), WorldSession::HandleAuctionListItems(), AuraEffect::HandleAuraOpenStable(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBeginTradeOpcode(), character_commandscript::HandleCharacterLevel(), cheat_commandscript::HandleExploreCheatCommand(), ticket_commandscript::HandleGMTicketUnAssignCommand(), WorldSession::HandleGrantLevel(), group_commandscript::HandleGroupReviveCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), lookup_commandscript::HandleLookupPlayerIpCommand(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMessagechatOpcode(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyGenderCommand(), modify_commandscript::HandleModifyHPCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyMoneyCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), modify_commandscript::HandleModifySpellCommand(), misc_commandscript::HandleMuteCommand(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleRaidReadyCheckOpcode(), reset_commandscript::HandleResetSpellsCommand(), reset_commandscript::HandleResetTalentsCommand(), spell_the_flag_of_ownership::HandleScript(), WorldSession::HandleSendMail(), send_commandscript::HandleSendMessageCommand(), WorldSession::HandleSetRaidDifficultyOpcode(), cheat_commandscript::HandleTaxiCheatCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnmuteCommand(), WorldSession::HandleWhoisOpcode(), WorldSession::HandleWhoOpcode(), ChatHandler::HasLowerSecurity(), lfg::LFGMgr::InitializeLockedDungeons(), InitTalentForLevel(), BattlegroundQueue::InviteGroupToBG(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), isBeingLoaded(), IsNeverVisible(), IsPetNeedBeTemporaryUnsummoned(), ObjectMgr::IsVendorItemValid(), IsVisibleGloballyFor(), Channel::JoinChannel(), lfg::LFGMgr::JoinLfg(), Channel::JoinNotify(), Channel::KickOrBan(), Unit::KnockbackFrom(), Channel::LeaveNotify(), Channel::List(), LoadFromDB(), Pet::LoadPetFromDB(), Group::NeedBeforeGreed(), go_tele_to_dalaran_crystal::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), npc_augustus_the_touched::OnGossipSelect(), npc_rivern_frostwind::OnGossipSelect(), npc_roxi_ramrocket::OnGossipSelect(), npc_wg_quest_giver::OnGossipSelect(), npc_drake_dealer_hurlunk::OnGossipSelect(), npc_shattrathflaskvendors::OnGossipSelect(), npc_slim::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_prof_leather::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), OnGossipSelect(), BattlefieldWG::OnPlayerLeaveWar(), ServerMailReward::OnPlayerLogin(), lfg::LFGPlayerScript::OnPlayerLogout(), lfg::LFGPlayerScript::OnPlayerMapChanged(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), Channel::Password(), Unit::PatchValuesUpdate(), Player(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), InstanceSaveMgr::PlayerBindToInstance(), MapMgr::PlayerCannotEnter(), InstanceSaveMgr::PlayerUnbindInstance(), InstanceSaveMgr::PlayerUnbindInstanceNotExtended(), BattlegroundSA::PostUpdateImpl(), PrepareGossipMenu(), PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), Battleground::ReadyMarkerClicked(), RemovePetitionsAndSigns(), Group::ResetMaxEnchantingLevel(), ResurrectPlayer(), RewardHonor(), Satisfy(), SaveToDB(), npc_prof_alchemy::SendActionMenu(), npc_prof_blacksmith::SendActionMenu(), npc_prof_tailor::SendActionMenu(), AuctionHouseMgr::SendAuctionExpiredMail(), AuctionHouseMgr::SendAuctionOutbiddedMail(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), Spell::SendCastResult(), SendEnchantmentDurations(), ChatHandler::SendGMText(), ChatHandler::SendGMText(), SendInitialPacketsAfterAddToMap(), BattlegroundQueue::SendJoinMessageArenaQueue(), lfg::LFGMgr::SendLfgRoleChosen(), MailDraft::SendMailTo(), BattlegroundQueue::SendMessageBGQueue(), Unit::SendMoveRoot(), AutobroadcastMgr::SendNotificationAnnouncement(), SendPreparedQuest(), SendQuestConfirmAccept(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), Spell::SendResurrectRequest(), SendSystemMessage(), SendTeleportAckPacket(), Group::SendUpdateToPlayer(), ReputationMgr::SendVisible(), AutobroadcastMgr::SendWorldAnnouncement(), ChatHandler::SendWorldText(), ChatHandler::SendWorldText(), ChatHandler::SendWorldTextOptional(), ChatHandler::SendWorldTextOptional(), Map::SendZoneMessage(), TradeData::SetAccepted(), Item::SetEnchantment(), SetGameMaster(), SetGMVisible(), SetMapChangeOrderCounter(), Channel::SetMode(), TradeData::SetMoney(), SetMovement(), Channel::SetOwner(), SetRestBonus(), Unit::SetSpeed(), Guild::Member::SetStats(), Channel::ShouldAnnouncePlayer(), SpawnCorpseBones(), SummonPet(), lfg::LFGMgr::TeleportPlayer(), TeleportTo(), Channel::ToggleModeration(), TradeCancel(), Channel::UnBan(), TradeData::Update(), Map::Update(), Pet::Update(), Update(), PetAI::UpdateAI(), UpdateLocalChannels(), Group::UpdatePlayerOutOfRange(), UpdatePosition(), UpdateSpeakTime(), WorldSession::VerifyMovementInfo(), Whisper(), Unit::Whisper(), Unit::Whisper(), and Whisper().

◆ GetShield()

Item * Player::GetShield ( bool  useable = false) const
525{
526 Item* item = nullptr;
527 if (useable)
529 else
531 if (!item || item->GetTemplate()->Class != ITEM_CLASS_ARMOR)
532 return nullptr;
533
534 if (!useable)
535 return item;
536
537 if (item->IsBroken())
538 return nullptr;
539
540 return item;
541}
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1250

References ItemTemplate::Class, EQUIPMENT_SLOT_OFFHAND, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), and ITEM_CLASS_ARMOR.

Referenced by AuraEffect::CalculateAmount().

◆ GetShieldBlockValue()

uint32 Player::GetShieldBlockValue ( ) const
overridevirtual

Implements Unit.

5106{
5108
5109 value = (value < 0) ? 0 : value;
5110
5111 return uint32(value);
5112}

References FLAT_MOD, Unit::GetStat(), m_auraBaseMod, PCT_MOD, SHIELD_BLOCK_VALUE, and STAT_STRENGTH.

Referenced by UpdateShieldBlockValue().

◆ GetSightRange()

float Player::GetSightRange ( WorldObject const *  target = nullptr) const
overridevirtual

Reimplemented from WorldObject.

16301{
16302 float sightRange = WorldObject::GetSightRange(target);
16304 sightRange += *_farSightDistance;
16305
16306 return sightRange;
16307}
virtual float GetSightRange(WorldObject const *target=nullptr) const
Definition Object.cpp:1695

References _farSightDistance, and WorldObject::GetSightRange().

Referenced by IsWorldObjectOutOfSightRange(), Group::UpdatePlayerOutOfRange(), and UpdateVisibilityForPlayer().

◆ GetSkillPermBonusValue()

int16 Player::GetSkillPermBonusValue ( uint32  skill) const
5547{
5548 if (!skill)
5549 return 0;
5550
5551 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5552 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5553 return 0;
5554
5556}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_PERM_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillStatusMap() [1/2]

SkillStatusMap & Player::GetSkillStatusMap ( )
inline
1775{ return mSkillStatus; }

References mSkillStatus.

◆ GetSkillStatusMap() [2/2]

SkillStatusMap const & Player::GetSkillStatusMap ( ) const
inline
1774{ return mSkillStatus; }

References mSkillStatus.

Referenced by WorldSession::HandleAuctionListItems().

◆ GetSkillStep()

uint16 Player::GetSkillStep ( uint16  skill) const
5458{
5459 if (!skill)
5460 return 0;
5461
5462 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5463 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5464 return 0;
5465
5466 return PAIR32_HIPART(GetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos)));
5467}
uint16 PAIR32_HIPART(uint32 x)
Definition ObjectDefines.h:93

References Object::GetUInt32Value(), mSkillStatus, PAIR32_HIPART(), PLAYER_SKILL_INDEX, and SKILL_DELETED.

Referenced by learn_commandscript::HandleLearnAllRecipesCommand(), and misc_commandscript::HandleSetSkillCommand().

◆ GetSkillTempBonusValue()

int16 Player::GetSkillTempBonusValue ( uint32  skill) const
5559{
5560 if (!skill)
5561 return 0;
5562
5563 SkillStatusMap::const_iterator itr = mSkillStatus.find(skill);
5564 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5565 return 0;
5566
5568}

References Object::GetUInt32Value(), mSkillStatus, PLAYER_SKILL_BONUS_INDEX, SKILL_DELETED, and SKILL_TEMP_BONUS.

Referenced by lookup_commandscript::HandleLookupSkillCommand().

◆ GetSkillValue()

◆ GetSocial()

◆ GetSpec()

uint32 Player::GetSpec ( int8  spec = -1)
16027{
16028 uint32 mostTalentTabId = 0;
16029 uint32 mostTalentCount = 0;
16030 uint32 specIdx = 0;
16031
16032 if (m_specsCount) // not all instances of Player have a spec for some reason
16033 {
16034 if (spec < 0)
16035 specIdx = m_activeSpec;
16036 else
16037 specIdx = spec;
16038 // find class talent tabs (all players have 3 talent tabs)
16039 uint32 const* talentTabIds = GetTalentTabPages(getClass());
16040
16041 for (uint8 i = 0; i < MAX_TALENT_TABS; ++i)
16042 {
16043 uint32 talentCount = 0;
16044 uint32 talentTabId = talentTabIds[i];
16045 for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
16046 {
16047 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
16048 if (!talentInfo)
16049 continue;
16050
16051 // skip another tab talents
16052 if (talentInfo->TalentTab != talentTabId)
16053 continue;
16054
16055 // find max talent rank (0~4)
16056 int8 curtalent_maxrank = -1;
16057 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
16058 {
16059 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], specIdx))
16060 {
16061 curtalent_maxrank = rank;
16062 break;
16063 }
16064 }
16065
16066 // not learned talent
16067 if (curtalent_maxrank < 0)
16068 continue;
16069
16070 talentCount += curtalent_maxrank + 1;
16071 }
16072
16073 if (mostTalentCount < talentCount)
16074 {
16075 mostTalentCount = talentCount;
16076 mostTalentTabId = talentTabId;
16077 }
16078 }
16079 }
16080 return mostTalentTabId;
16081}
uint32 const * GetTalentTabPages(uint8 cls)
Definition DBCStores.cpp:824
#define MAX_TALENT_TABS
Definition DBCStructure.h:1921

References Unit::getClass(), GetTalentTabPages(), HasTalent(), m_activeSpec, m_specsCount, MAX_TALENT_RANK, MAX_TALENT_TABS, TalentEntry::RankID, sTalentStore, and TalentEntry::TalentTab.

Referenced by HasCasterSpec(), HasHealSpec(), HasMeleeSpec(), and HasTankSpec().

◆ GetSpecsCount()

uint8 Player::GetSpecsCount ( ) const
inline

◆ GetSpellByProto()

uint32 Player::GetSpellByProto ( ItemTemplate proto)

◆ GetSpellCooldownDelay()

uint32 Player::GetSpellCooldownDelay ( uint32  spell_id) const
16373{
16374 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16375 return uint32(itr != m_spellCooldowns.end() && itr->second.end > getMSTime() ? itr->second.end - getMSTime() : 0);
16376}
uint32 getMSTime()
Definition Timer.h:103

References getMSTime(), and m_spellCooldowns.

Referenced by CanExecutePendingSpellCastRequest(), CanRequestSpellCast(), Aura::HandleAuraSpecificMods(), npc_brewfest_keg_reciver::MoveInLineOfSight(), and ProhibitSpellSchool().

◆ GetSpellCooldownMap() [1/2]

SpellCooldowns & Player::GetSpellCooldownMap ( )
inline
1772{ return m_spellCooldowns; }

References m_spellCooldowns.

◆ GetSpellCooldownMap() [2/2]

◆ GetSpellCooldowns()

SpellCooldowns Player::GetSpellCooldowns ( ) const
inline
2168{ return m_spellCooldowns; }

References m_spellCooldowns.

Referenced by Unit::HandleDummyAuraProc().

◆ GetSpellCritFromIntellect()

float Player::GetSpellCritFromIntellect ( )
5185{
5186 uint8 level = GetLevel();
5187 uint32 pclass = getClass();
5188
5189 if (level > GT_MAX_LEVEL)
5190 level = GT_MAX_LEVEL;
5191
5192 GtChanceToSpellCritBaseEntry const* critBase = sGtChanceToSpellCritBaseStore.LookupEntry(pclass - 1);
5193 GtChanceToSpellCritEntry const* critRatio = sGtChanceToSpellCritStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5194 if (!critBase || !critRatio)
5195 return 0.0f;
5196
5197 float crit = critBase->base + GetStat(STAT_INTELLECT) * critRatio->ratio;
5198 return crit * 100.0f;
5199}
DBCStorage< GtChanceToSpellCritBaseEntry > sGtChanceToSpellCritBaseStore(GtChanceToSpellCritBasefmt)
DBCStorage< GtChanceToSpellCritEntry > sGtChanceToSpellCritStore(GtChanceToSpellCritfmt)
Definition DBCStructure.h:1063
float base
Definition DBCStructure.h:1064
Definition DBCStructure.h:1073
float ratio
Definition DBCStructure.h:1074

References GtChanceToSpellCritBaseEntry::base, Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtChanceToSpellCritEntry::ratio, sGtChanceToSpellCritBaseStore, sGtChanceToSpellCritStore, and STAT_INTELLECT.

Referenced by UpdateSpellCritChance().

◆ GetSpellMap() [1/2]

PlayerSpellMap & Player::GetSpellMap ( )
inline
1769{ return m_spells; }

References m_spells.

◆ GetSpellMap() [2/2]

◆ GetSpellModList()

SpellModList const & Player::GetSpellModList ( uint32  type) const
inline
2612{ return m_spellMods[type]; }

References m_spellMods.

Referenced by WorldSession::HandlePlayerLoginToCharInWorld().

◆ GetSpellPenetrationItemMod()

int32 Player::GetSpellPenetrationItemMod ( ) const
inline

◆ GetSpellQueueWindow()

uint32 Player::GetSpellQueueWindow ( ) const
protected
2290{
2291 return sWorld->getIntConfig(CONFIG_SPELL_QUEUE_WINDOW);
2292}
@ CONFIG_SPELL_QUEUE_WINDOW
Definition WorldConfig.h:381

References CONFIG_SPELL_QUEUE_WINDOW, and sWorld.

Referenced by CanExecutePendingSpellCastRequest(), and CanRequestSpellCast().

◆ GetsRecruitAFriendBonus()

bool Player::GetsRecruitAFriendBonus ( bool  forXP)
12736{
12737 bool recruitAFriend = false;
12738 if (GetLevel() <= sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL) || !forXP)
12739 {
12740 if (Group* group = this->GetGroup())
12741 {
12742 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12743 {
12744 Player* player = itr->GetSource();
12745 if (!player || !player->IsInMap(this))
12746 continue;
12747
12748 if (!player->IsAtRecruitAFriendDistance(this))
12749 continue; // member (alive or dead) or his corpse at req. distance
12750
12751 if (forXP)
12752 {
12753 // level must be allowed to get RaF bonus
12754 if (player->GetLevel() > sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
12755 continue;
12756
12757 // level difference must be small enough to get RaF bonus, UNLESS we are lower level
12758 if (player->GetLevel() < GetLevel())
12760 continue;
12761 }
12762
12763 bool ARecruitedB = (player->GetSession()->GetRecruiterId() == GetSession()->GetAccountId());
12764 bool BRecruitedA = (GetSession()->GetRecruiterId() == player->GetSession()->GetAccountId());
12765 if (ARecruitedB || BRecruitedA)
12766 {
12767 recruitAFriend = true;
12768 break;
12769 }
12770 }
12771 }
12772 }
12773 return recruitAFriend;
12774}
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL
Definition WorldConfig.h:200
@ CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE
Definition WorldConfig.h:201
bool IsAtRecruitAFriendDistance(WorldObject const *pOther) const
Definition Player.cpp:12845
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1318
uint32 GetRecruiterId() const
Definition WorldSession.h:588

References CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE, WorldSession::GetAccountId(), GetGroup(), Unit::GetLevel(), WorldSession::GetRecruiterId(), GetSession(), IsAtRecruitAFriendDistance(), WorldObject::IsInMap(), and sWorld.

Referenced by CalculateReputationGain(), GiveXP(), and SetRestBonus().

◆ GetStartPosition()

WorldLocation Player::GetStartPosition ( ) const
11423{
11424 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
11425 uint32 mapId = info->mapId;
11427 return WorldLocation(0, 2352.0f, -5709.0f, 154.5f, 0.0f);
11428 return WorldLocation(mapId, info->positionX, info->positionY, info->positionZ, 0);
11429}

References CLASS_CONTEXT_INIT, CLASS_DEATH_KNIGHT, Unit::getClass(), Unit::getRace(), HasSpell(), IsClass(), PlayerInfo::mapId, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, and sObjectMgr.

Referenced by misc_commandscript::HandleUnstuckCommand().

◆ GetStoredRaidDifficulty()

Difficulty Player::GetStoredRaidDifficulty ( ) const
inline
1918{ return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map

References m_raidMapDifficulty.

Referenced by SendInitialPacketsAfterAddToMap().

◆ GetSubGroup()

uint8 Player::GetSubGroup ( ) const
inline

◆ GetSummonExpireTimer()

time_t Player::GetSummonExpireTimer ( ) const
inline
1103{ return m_summon_expire; }

References m_summon_expire.

Referenced by Spell::CheckCast().

◆ GetTalentMap()

◆ GetTalentTreePoints()

void Player::GetTalentTreePoints ( uint8(&)  specPoints[3]) const
15400{
15401 const PlayerTalentMap& talentMap = GetTalentMap();
15402 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
15403 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec()))
15404 if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID))
15405 if (TalentTabEntry const* tab = sTalentTabStore.LookupEntry(talentInfo->TalentTab))
15406 if (tab->tabpage < 3)
15407 {
15408 // find current talent rank
15409 uint8 currentTalentRank = 0;
15410 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
15411 if (talentInfo->RankID[rank] && itr->first == talentInfo->RankID[rank])
15412 {
15413 currentTalentRank = rank + 1;
15414 break;
15415 }
15416 specPoints[tab->tabpage] += currentTalentRank;
15417 }
15418}

References GetActiveSpec(), GetTalentMap(), MAX_TALENT_RANK, PLAYERSPELL_REMOVED, sTalentStore, and sTalentTabStore.

Referenced by lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTeamId()

TeamId Player::GetTeamId ( bool  original = false) const
inline
2108{ return original ? TeamIdForRace(getRace(true)) : m_team; };
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5849

References Unit::getRace(), m_team, and TeamIdForRace().

Referenced by ActivateTaxiPathTo(), GameObject::ActivateToQuest(), BattlegroundQueue::AddGroup(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), npc_love_in_air_snivel::AllowAction(), BattlegroundSA::AllowDefenseOfTheAncients(), LootItem::AllowedForPlayer(), Battlefield::AskToLeaveQueue(), SocialMgr::BroadcastToFriendListers(), WorldState::BuffMagtheridonTeam(), Corpse::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_steam_powered_auctioneer::npc_steam_powered_auctioneerAI::CanBeSeen(), npc_mei_francis_mount::npc_mei_francis_mountAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), OPvPCapturePointZM_Graveyard::CanTalkTo(), CanUseItem(), BattlegroundSA::CaptureGraveyard(), ServerMailCondition::CheckCondition(), ContinueTaxiFlight(), MapInstanced::CreateInstance(), BattlegroundSA::DefendersPortalTeleport(), WorldState::DispelMagtheridonTeam(), BattlegroundIC::DoAction(), DuelComplete(), Spell::EffectTeleportUnits(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundIC::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), BattlegroundAV::EventPlayerDefendsPoint(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundSA::EventPlayerUsedGO(), GetBgTeamId(), Battlefield::GetClosestGraveyard(), BattlegroundAB::GetClosestGraveyard(), BattlegroundAV::GetClosestGraveyard(), BattlegroundEY::GetClosestGraveyard(), BattlegroundIC::GetClosestGraveyard(), BattlegroundSA::GetClosestGraveyard(), BattlegroundWS::GetClosestGraveyard(), SocialMgr::GetFriendInfo(), ObjectMgr::GetModelForShapeshift(), Battleground::GetRealRepFactionForPlayer(), Guild::HandleAcceptMember(), BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), BattlegroundEY::HandleAreaTrigger(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleArenaTeamAcceptOpcode(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleCalendarEventInvite(), OutdoorPvPSI::HandleDropFlag(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), BattlefieldWG::HandleKill(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundAV::HandleKillPlayer(), BattlegroundIC::HandleKillPlayer(), BattlegroundAV::HandleKillUnit(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleOfferPetitionOpcode(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), WorldState::HandlePlayerEnterZone(), Battlefield::HandlePlayerEnterZone(), OutdoorPvP::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), WorldState::HandlePlayerLeaveZone(), Battlefield::HandlePlayerLeaveZone(), OutdoorPvP::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), BattlegroundIC::HandlePlayerResurrect(), BattlegroundAV::HandleQuestComplete(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), WorldSession::HandleSendMail(), WorldSession::HandleWhoOpcode(), Battlefield::HasPlayer(), OutdoorPvP::HasPlayer(), lfg::LFGMgr::InitializeLockedDungeons(), Channel::Invite(), Battlefield::InvitePlayerToQueue(), Battlefield::InvitePlayerToWar(), SpellArea::IsFitToRequirements(), IsGroupVisibleFor(), BfCapturePoint::IsInsideObjective(), OPvPCapturePoint::IsInsideObjective(), lfg::LFGMgr::JoinRaidBrowser(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustEngagedWith(), Unit::Kill(), lfg::LFGMgr::LfrSearchAdd(), lfg::LFGMgr::LfrSearchRemove(), lfg::LFGMgr::LfrSetComment(), LoadFromDB(), AchievementCriteriaData::Meets(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), achievement_resilient_victory::OnCheck(), achievement_bg_control_all_nodes::OnCheck(), achievement_bg_ic_resource_glut::OnCheck(), achievement_everything_counts::OnCheck(), achievement_bg_av_perfection::OnCheck(), achievement_not_even_a_scratch::OnCheck(), BattlefieldWG::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_spirit_guide::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), instance_utgarde_keep::instance_utgarde_keep_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerLogin(), ServerMailReward::OnPlayerLogin(), MidsummerPlayerScript::OnPlayerUpdateZone(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), AreaTrigger_at_legion_teleporter::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Battlefield::PlayerAcceptInviteToQueue(), Battlefield::PlayerAcceptInviteToWar(), RepopAtGraveyard(), ReportedAfkBy(), RewardHonor(), RewardReputation(), Satisfy(), AchievementMgr::SendAchievementEarned(), WorldSession::SendListInventory(), SendLoot(), Acore::MessageDistDeliverer::SendPacket(), lfg::LFGMgr::SendRaidBrowserCachedList(), lfg::LFGMgr::SendRaidBrowserJoinedPacket(), WorldSession::SendSpiritResurrect(), SendTaxiNodeStatusMultiple(), WorldSession::SendTaxiStatus(), Map::SendZoneMessage(), Creature::SendZoneUnderAttackMessage(), spell_item_recall::SetDest(), SetEntryPoint(), SetFactionForRace(), Channel::SetMode(), Channel::SetOwner(), BattlegroundSA::TeleportToEntrancePosition(), OPvPCapturePoint::Update(), UpdateArea(), npc_midsummer_bonfire::UpdateBonfireBlessingBuffs(), UpdateLFGChannel(), UpdateLocalChannels(), UpdateZone(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ GetTeleportDest()

WorldLocation & Player::GetTeleportDest ( )
inline

◆ GetTemporaryUnsummonedPetNumber()

uint32 Player::GetTemporaryUnsummonedPetNumber ( ) const
inline

◆ GetTotalBaseModValue()

float Player::GetTotalBaseModValue ( BaseModGroup  modGroup) const
5092{
5093 if (modGroup >= BASEMOD_END)
5094 {
5095 LOG_ERROR("entities.player", "wrong BaseModGroup in GetTotalBaseModValue()!");
5096 return 0.0f;
5097 }
5098
5099 if (m_auraBaseMod[modGroup][PCT_MOD] <= 0.0f)
5100 return 0.0f;
5101
5102 return m_auraBaseMod[modGroup][FLAT_MOD] * m_auraBaseMod[modGroup][PCT_MOD];
5103}

References BASEMOD_END, FLAT_MOD, LOG_ERROR, m_auraBaseMod, and PCT_MOD.

◆ GetTotalPercentageModValue()

float Player::GetTotalPercentageModValue ( BaseModGroup  modGroup) const
inline
2196{ return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }

References FLAT_MOD, m_auraBaseMod, and PCT_MOD.

Referenced by UpdateCritPercentage().

◆ GetTotalPlayedTime()

◆ GetTradeData()

◆ GetTrader()

Player * Player::GetTrader ( ) const
inline
1374{ return m_trade ? m_trade->GetTrader() : nullptr; }
Player * GetTrader() const
Definition TradeData.h:41

References TradeData::GetTrader(), and m_trade.

Referenced by WorldSession::moveItems(), and UpdatePosition().

◆ GetTrainerSpellState()

TrainerSpellState Player::GetTrainerSpellState ( TrainerSpell const *  trainer_spell) const
3910{
3911 if (!trainer_spell)
3912 return TRAINER_SPELL_RED;
3913
3914 bool hasSpell = true;
3915 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3916 {
3917 if (!trainer_spell->learnedSpell[i])
3918 continue;
3919
3920 if (!HasSpell(trainer_spell->learnedSpell[i]))
3921 {
3922 hasSpell = false;
3923 break;
3924 }
3925 }
3926 // known spell
3927 if (hasSpell)
3928 return TRAINER_SPELL_GRAY;
3929
3930 // check skill requirement
3931 if (trainer_spell->reqSkill && GetBaseSkillValue(trainer_spell->reqSkill) < trainer_spell->reqSkillValue)
3932 return TRAINER_SPELL_RED;
3933
3934 // check level requirement
3935 if (GetLevel() < trainer_spell->reqLevel)
3936 return TRAINER_SPELL_RED;
3937
3938 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3939 {
3940 if (!trainer_spell->learnedSpell[i])
3941 continue;
3942
3943 // check race/class requirement
3944 if (!IsSpellFitByClassAndRace(trainer_spell->learnedSpell[i]))
3945 return TRAINER_SPELL_RED;
3946
3947 if (uint32 prevSpell = sSpellMgr->GetPrevSpellInChain(trainer_spell->learnedSpell[i]))
3948 {
3949 // check prev.rank requirement
3950 if (prevSpell && !HasSpell(prevSpell))
3951 return TRAINER_SPELL_RED;
3952 }
3953
3954 SpellsRequiringSpellMapBounds spellsRequired = sSpellMgr->GetSpellsRequiredForSpellBounds(trainer_spell->learnedSpell[i]);
3955 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequired.first; itr != spellsRequired.second; ++itr)
3956 {
3957 // check additional spell requirement
3958 if (!HasSpell(itr->second))
3959 return TRAINER_SPELL_RED;
3960 }
3961 }
3962
3963 // check primary prof. limit
3964 // first rank of primary profession spell when there are no proffesions avalible is disabled
3965 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3966 {
3967 if (!trainer_spell->learnedSpell[i])
3968 continue;
3969 SpellInfo const* learnedSpellInfo = sSpellMgr->GetSpellInfo(trainer_spell->learnedSpell[i]);
3970 if (learnedSpellInfo && learnedSpellInfo->IsPrimaryProfessionFirstRank() && (GetFreePrimaryProfessionPoints() == 0))
3972 }
3973
3974 return TRAINER_SPELL_GREEN;
3975}
@ TRAINER_SPELL_GREEN
Definition Player.h:215
@ TRAINER_SPELL_GRAY
Definition Player.h:217
@ TRAINER_SPELL_GREEN_DISABLED
Definition Player.h:218
@ TRAINER_SPELL_RED
Definition Player.h:216
std::pair< SpellsRequiringSpellMap::const_iterator, SpellsRequiringSpellMap::const_iterator > SpellsRequiringSpellMapBounds
Definition SpellMgr.h:570
bool IsSpellFitByClassAndRace(uint32 spell_id) const
Definition Player.cpp:12407

References GetBaseSkillValue(), GetFreePrimaryProfessionPoints(), Unit::GetLevel(), HasSpell(), SpellInfo::IsPrimaryProfessionFirstRank(), IsSpellFitByClassAndRace(), TrainerSpell::learnedSpell, MAX_SPELL_EFFECTS, TrainerSpell::reqLevel, TrainerSpell::reqSkill, TrainerSpell::reqSkillValue, sSpellMgr, TRAINER_SPELL_GRAY, TRAINER_SPELL_GREEN, TRAINER_SPELL_GREEN_DISABLED, and TRAINER_SPELL_RED.

Referenced by WorldSession::HandleTrainerBuySpellOpcode(), and WorldSession::SendTrainerList().

◆ GetUseableItemByPos()

Item * Player::GetUseableItemByPos ( uint8  bag,
uint8  slot 
) const
inline

◆ GetViewpoint()

WorldObject * Player::GetViewpoint ( ) const
13260{
13262 return static_cast<WorldObject*>(ObjectAccessor::GetObjectByTypeMask(*this, guid, TYPEMASK_SEER));
13263 return nullptr;
13264}
@ TYPEMASK_SEER
Definition ObjectGuid.h:54
Definition Object.h:472
Object * GetObjectByTypeMask(WorldObject const &, ObjectGuid const &guid, uint32 typemask)
Definition ObjectAccessor.cpp:141

References Object::GetGuidValue(), ObjectAccessor::GetObjectByTypeMask(), PLAYER_FARSIGHT, and TYPEMASK_SEER.

Referenced by CinematicMgr::EndCinematic(), WorldSession::HandleFarSightOpcode(), ArenaSpectator::HandleSpectatorWatchCommand(), RemoveFromWorld(), StopCastingBindSight(), and Map::Update().

◆ GetWeaponForAttack()

Item * Player::GetWeaponForAttack ( WeaponAttackType  attackType,
bool  useable = false 
) const
490{
491 uint8 slot;
492 switch (attackType)
493 {
494 case BASE_ATTACK:
496 break;
497 case OFF_ATTACK:
499 break;
500 case RANGED_ATTACK:
502 break;
503 default:
504 return nullptr;
505 }
506
507 Item* item = nullptr;
508 if (useable)
510 else
512 if (!item || item->GetTemplate()->Class != ITEM_CLASS_WEAPON)
513 return nullptr;
514
515 if (!useable)
516 return item;
517
518 if (item->IsBroken() || IsInFeralForm())
519 return nullptr;
520
521 return item;
522}

References BASE_ATTACK, ItemTemplate::Class, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetItemByPos(), Item::GetTemplate(), GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), Unit::IsInFeralForm(), ITEM_CLASS_WEAPON, OFF_ATTACK, and RANGED_ATTACK.

Referenced by AuraEffect::CalculateAmount(), CheckAmmoCompatibility(), Spell::CheckItems(), Spell::EffectEnchantItemTmp(), Spell::EffectWeaponDmg(), Unit::GetAPMultiplier(), GetBaseWeaponSkillValue(), GetMeleeDamageSchoolMask(), AuraEffect::HandleAuraModWeaponCritPercent(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), HasWeapon(), HasWeaponForAttack(), SetRegularAttackTime(), SetSheath(), Spell::Spell(), boss_viscidus::SpellHit(), Spell::TakeAmmo(), UpdateExpertise(), UpdateWeaponSkill(), and Spell::WriteAmmoToPacket().

◆ GetWeaponProficiency()

uint32 Player::GetWeaponProficiency ( ) const
inline
1359{ return m_WeaponProficiency; }

References m_WeaponProficiency.

Referenced by Spell::EffectProficiency().

◆ GetXPRestBonus()

uint32 Player::GetXPRestBonus ( uint32  xp)
8930{
8931 uint32 rested_bonus = (uint32)GetRestBonus(); // xp for each rested bonus
8932
8933 if (rested_bonus > xp) // max rested_bonus == xp or (r+x) = 200% xp
8934 rested_bonus = xp;
8935
8936 SetRestBonus(GetRestBonus() - rested_bonus);
8937
8938 LOG_DEBUG("entities.player", "Player gain {} xp (+ {} Rested Bonus). Rested points={}", xp + rested_bonus, rested_bonus, GetRestBonus());
8939 return rested_bonus;
8940}
void SetRestBonus(float restBonusNew)
Definition Player.cpp:10229
float GetRestBonus() const
Definition Player.h:1200

References GetRestBonus(), LOG_DEBUG, and SetRestBonus().

Referenced by GiveXP().

◆ GetZoneIdFromDB()

uint32 Player::GetZoneIdFromDB ( ObjectGuid  guid)
static
6344{
6345 ObjectGuid::LowType guidLow = guid.GetCounter();
6346
6348 stmt->SetData(0, guidLow);
6349 PreparedQueryResult result = CharacterDatabase.Query(stmt);
6350
6351 if (!result)
6352 return 0;
6353
6354 Field* fields = result->Fetch();
6355 uint32 zone = fields[0].Get<uint16>();
6356
6357 if (!zone)
6358 {
6359 // stored zone is zero, use generic and slow zone detection
6360 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_POSITION_XYZ);
6361 stmt->SetData(0, guidLow);
6362 PreparedQueryResult posResult = CharacterDatabase.Query(stmt);
6363
6364 if (!posResult)
6365 {
6366 return 0;
6367 }
6368
6369 fields = posResult->Fetch();
6370 uint32 map = fields[0].Get<uint16>();
6371 float posx = fields[1].Get<float>();
6372 float posy = fields[2].Get<float>();
6373 float posz = fields[3].Get<float>();
6374
6375 if (!sMapStore.LookupEntry(map))
6376 return 0;
6377
6378 zone = sMapMgr->GetZoneId(PHASEMASK_NORMAL, map, posx, posy, posz);
6379
6380 if (zone > 0)
6381 {
6382 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ZONE);
6383
6384 stmt->SetData(0, uint16(zone));
6385 stmt->SetData(1, guidLow);
6386
6387 CharacterDatabase.Execute(stmt);
6388 }
6389 }
6390
6391 return zone;
6392}
@ CHAR_SEL_CHAR_POSITION_XYZ
Definition CharacterDatabase.h:53
@ CHAR_UPD_ZONE
Definition CharacterDatabase.h:296
@ CHAR_SEL_CHAR_ZONE
Definition CharacterDatabase.h:51

References CHAR_SEL_CHAR_POSITION_XYZ, CHAR_SEL_CHAR_ZONE, CHAR_UPD_ZONE, CharacterDatabase, Field::Get(), ObjectGuid::GetCounter(), PHASEMASK_NORMAL, PreparedStatementBase::SetData(), sMapMgr, and sMapStore.

Referenced by Guild::Member::LoadFromDB().

◆ GiveLevel()

void Player::GiveLevel ( uint8  level)
Todo:
find some better solution
2446{
2447 uint8 oldLevel = GetLevel();
2448 if (level == oldLevel)
2449 return;
2450
2451 if (!sScriptMgr->OnPlayerCanGiveLevel(this, level))
2452 return;
2453
2454 if (Guild* guild = GetGuild())
2455 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_LEVEL, level);
2456
2457 PlayerLevelInfo info;
2458 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), level, &info);
2459
2460 PlayerClassLevelInfo classInfo;
2461 sObjectMgr->GetPlayerClassLevelInfo(getClass(), level, &classInfo);
2462
2464 packet.Level = level;
2465 packet.HealthDelta = int32(classInfo.basehealth) - int32(GetCreateHealth());
2466
2468 // for (int i = 0; i < MAX_POWERS; ++i)
2469 packet.PowerDelta[0] = int32(classInfo.basemana) - int32(GetCreateMana());
2470 packet.PowerDelta[1] = 0;
2471 packet.PowerDelta[2] = 0;
2472 packet.PowerDelta[3] = 0;
2473 packet.PowerDelta[4] = 0;
2474 packet.PowerDelta[5] = 0;
2475
2476 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2477 packet.StatDelta[i] = int32(info.stats[i]) - GetCreateStat(Stats(i));
2478
2479 SendDirectMessage(packet.Write());
2480
2481 SetUInt32Value(PLAYER_NEXT_LEVEL_XP, sObjectMgr->GetXPForLevel(level));
2482
2483 //update level, max level of skills
2484 m_Played_time[PLAYED_TIME_LEVEL] = 0; // Level Played Time reset
2485
2488
2489 SetLevel(level);
2490
2492
2493 // save base values (bonuses already included in stored stats
2494 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2495 SetCreateStat(Stats(i), info.stats[i]);
2496
2497 SetCreateHealth(classInfo.basehealth);
2498 SetCreateMana(classInfo.basemana);
2499
2503
2505
2506 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL)) // Max weapon skill when leveling up
2508
2511
2512 if (!isDead())
2513 {
2514 // set current level health and mana/energy to maximum after applying all mods.
2515 SetFullHealth();
2522 }
2523
2524 // update level to hunter/summon pet
2525 if (Pet* pet = GetPet())
2526 pet->SynchronizeLevelWithOwner();
2527
2528 MailLevelReward const* mailReward = sObjectMgr->GetMailLevelReward(level, getRaceMask());
2529 if (mailReward && sScriptMgr->OnPlayerCanGiveMailRewardAtGiveLevel(this, level))
2530 {
2531 //- TODO: Poor design of mail system
2532 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2533 MailDraft(mailReward->mailTemplateId).SendMailTo(trans, this, MailSender(MAIL_CREATURE, mailReward->senderEntry));
2534 CharacterDatabase.CommitTransaction(trans);
2535 }
2536
2538
2539 // Refer-A-Friend
2540 if (GetSession()->GetRecruiterId())
2541 if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
2542 if (level % 2 == 0)
2543 {
2545
2546 if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
2548 }
2549
2551
2552 sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
2553}
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL
Definition DBCEnums.h:124
@ GUILD_MEMBER_DATA_LEVEL
Definition Guild.h:59
@ POWER_RAGE
Definition SharedDefines.h:281
@ POWER_HAPPINESS
Definition SharedDefines.h:284
@ POWER_ENERGY
Definition SharedDefines.h:283
@ POWER_FOCUS
Definition SharedDefines.h:282
@ PLAYER_NEXT_LEVEL_XP
Definition UpdateFields.h:340
@ CONFIG_ALWAYS_MAXSKILL
Definition WorldConfig.h:87
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:938
void _ApplyAllLevelScaleItemMods(bool apply)
Definition Player.cpp:7666
void UpdateSkillsToMaxSkillsForLevel()
Definition PlayerUpdates.cpp:1130
Guild * GetGuild() const
Definition Player.cpp:16020
void UpdateSkillsForLevel()
Definition PlayerUpdates.cpp:1079
void SendQuestGiverStatusMultiple()
Definition Player.cpp:7743
void SetCreateStat(Stats stat, float val)
Definition Unit.h:1042
void SetCreateHealth(uint32 val)
Definition Unit.h:1090
void SetCreateMana(uint32 val)
Definition Unit.h:1112
void SetLevel(uint8 lvl, bool showLevelChange=true)
Definition Unit.cpp:15489
uint32 GetCreateHealth() const
Definition Unit.h:1074
uint32 GetCreateMana() const
Definition Unit.h:1111
bool isDead() const
Definition Unit.h:1750
Definition MiscPackets.h:45
uint32 Level
Definition MiscPackets.h:51
std::array< uint32, MAX_STATS > StatDelta
Definition MiscPackets.h:54
std::array< uint32, MAX_POWERS > PowerDelta
Definition MiscPackets.h:53
uint32 HealthDelta
Definition MiscPackets.h:52
WorldPacket const * Write() override
Definition MiscPackets.cpp:34
Definition ObjectMgr.h:543
uint32 senderEntry
Definition ObjectMgr.h:549
uint32 mailTemplateId
Definition ObjectMgr.h:548
Definition Player.h:285
uint32 basehealth
Definition Player.h:287
uint32 basemana
Definition Player.h:288
Definition Player.h:299
std::array< uint32, MAX_STATS > stats
Definition Player.h:305

References Unit::_ApplyAllAuraStatMods(), _ApplyAllLevelScaleItemMods(), Unit::_RemoveAllAuraStatMods(), ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL, PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CharacterDatabase, CONFIG_ALWAYS_MAXSKILL, CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreateHealth(), Unit::GetCreateMana(), Unit::GetCreateStat(), GetGuild(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Unit::getRaceMask(), GetSession(), GUILD_MEMBER_DATA_LEVEL, Object::HasByteFlag(), WorldPackets::Misc::LevelUpInfo::HealthDelta, InitGlyphsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), Unit::isDead(), WorldPackets::Misc::LevelUpInfo::Level, m_grantableLevels, m_Played_time, MAIL_CREATURE, MailLevelReward::mailTemplateId, MAX_STATS, PLAYED_TIME_LEVEL, PLAYER_FIELD_BYTES, PLAYER_NEXT_LEVEL_XP, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, WorldPackets::Misc::LevelUpInfo::PowerDelta, SendDirectMessage(), MailLevelReward::senderEntry, MailDraft::SendMailTo(), SendQuestGiverStatusMultiple(), Object::SetByteFlag(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Unit::SetFullHealth(), Unit::SetLevel(), Unit::SetPower(), Unit::SetUInt32Value(), sObjectMgr, sScriptMgr, STAT_STRENGTH, WorldPackets::Misc::LevelUpInfo::StatDelta, PlayerLevelInfo::stats, sWorld, UpdateAchievementCriteria(), UpdateAllStats(), UpdateSkillsForLevel(), UpdateSkillsToMaxSkillsForLevel(), and WorldPackets::Misc::LevelUpInfo::Write().

Referenced by GiveXP(), WorldSession::HandleAcceptGrantLevel(), and character_commandscript::HandleCharacterLevel().

◆ GiveQuestSourceItem()

bool Player::GiveQuestSourceItem ( Quest const *  quest)
1336{
1337 uint32 srcitem = quest->GetSrcItemId();
1338 if (srcitem > 0)
1339 {
1340 uint32 count = quest->GetSrcItemCount();
1341 if (count <= 0)
1342 count = 1;
1343
1344 ItemPosCountVec dest;
1345 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, srcitem, count);
1346 if (msg == EQUIP_ERR_OK)
1347 {
1348 Item* item = StoreNewItem(dest, srcitem, true);
1349 SendNewItem(item, count, true, false);
1350 return true;
1351 }
1352 // player already have max amount required item, just report success
1353 else if (msg == EQUIP_ERR_CANT_CARRY_MORE_OF_THIS)
1354 return true;
1355 else
1356 SendEquipError(msg, nullptr, nullptr, srcitem);
1357 return false;
1358 }
1359
1360 return true;
1361}

References CanStoreNewItem(), EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), NULL_BAG, NULL_SLOT, SendEquipError(), SendNewItem(), and StoreNewItem().

Referenced by AddQuest().

◆ GiveXP()

void Player::GiveXP ( uint32  xp,
Unit victim,
float  group_rate = 1.0f,
bool  isLFGReward = false 
)
2371{
2372 if (xp < 1)
2373 {
2374 return;
2375 }
2376
2377 if (!IsAlive() && !GetBattlegroundId() && !isLFGReward)
2378 {
2379 return;
2380 }
2381
2383 {
2384 return;
2385 }
2386
2387 if (victim && victim->IsCreature() && !victim->ToCreature()->hasLootRecipient())
2388 {
2389 return;
2390 }
2391
2392 uint8 level = GetLevel();
2393
2394 // Favored experience increase START
2395 uint32 zone = GetZoneId();
2396 float favored_exp_mult = 0;
2397 if ((zone == AREA_HELLFIRE_PENINSULA || zone == AREA_HELLFIRE_RAMPARTS || zone == AREA_MAGTHERIDONS_LAIR || zone == AREA_THE_BLOOD_FURNACE || zone == AREA_THE_SHATTERED_HALLS) && HasAnyAuras(32096 /*Thrallmar's Favor*/, 32098 /*Honor Hold's Favor*/))
2398 favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
2399
2400 xp = uint32(xp * (1 + favored_exp_mult));
2401 // Favored experience increase END
2402
2403 // XP to money conversion processed in Player::RewardQuest
2404 if (level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2405 return;
2406
2407 uint32 bonus_xp = 0;
2408 bool recruitAFriend = GetsRecruitAFriendBonus(true);
2409
2410 // RaF does NOT stack with rested experience
2411 if (recruitAFriend)
2412 bonus_xp = 2 * xp; // xp + bonus_xp must add up to 3 * xp for RaF; calculation for quests done client-side
2413 else
2414 bonus_xp = victim ? GetXPRestBonus(xp) : 0; // XP resting bonus
2415
2416 // hooks and multipliers can modify the xp with a zero or negative value
2417 // check again before sending invalid xp to the client
2418 if (xp < 1)
2419 {
2420 return;
2421 }
2422
2423 SendLogXPGain(xp, victim, bonus_xp, recruitAFriend, group_rate);
2424
2427 uint32 newXP = curXP + xp + bonus_xp;
2428
2429 while (newXP >= nextLvlXP && level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2430 {
2431 newXP -= nextLvlXP;
2432
2433 if (level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
2434 GiveLevel(level + 1);
2435
2436 level = GetLevel();
2438 }
2439
2440 SetUInt32Value(PLAYER_XP, newXP);
2441}
@ AREA_THE_BLOOD_FURNACE
Definition AreaDefines.h:120
@ AREA_HELLFIRE_RAMPARTS
Definition AreaDefines.h:109
@ AREA_MAGTHERIDONS_LAIR
Definition AreaDefines.h:131
@ AREA_HELLFIRE_PENINSULA
Definition AreaDefines.h:98
@ AREA_THE_SHATTERED_HALLS
Definition AreaDefines.h:121
@ PLAYER_FLAGS_NO_XP_GAIN
Definition Player.h:493
bool hasLootRecipient() const
Definition Creature.h:234
bool IsCreature() const
Definition Object.h:205
void GiveLevel(uint8 level)
Definition Player.cpp:2445
uint32 GetXPRestBonus(uint32 xp)
Definition Player.cpp:8929
void SendLogXPGain(uint32 GivenXP, Unit *victim, uint32 BonusXP, bool recruitAFriend=false, float group_rate=1.0f)
Definition Player.cpp:2351
bool HasAnyAuras(Auras... spellIds) const
Checks if the unit has ANY specified auras.
Definition Unit.h:1435

References AREA_HELLFIRE_PENINSULA, AREA_HELLFIRE_RAMPARTS, AREA_MAGTHERIDONS_LAIR, AREA_THE_BLOOD_FURNACE, AREA_THE_SHATTERED_HALLS, CONFIG_MAX_PLAYER_LEVEL, GetBattlegroundId(), Unit::GetLevel(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), GetXPRestBonus(), WorldObject::GetZoneId(), GiveLevel(), Unit::HasAnyAuras(), Creature::hasLootRecipient(), HasPlayerFlag(), Unit::IsAlive(), Object::IsCreature(), PLAYER_FLAGS_NO_XP_GAIN, PLAYER_NEXT_LEVEL_XP, PLAYER_XP, SendLogXPGain(), Unit::SetUInt32Value(), sWorld, and Object::ToCreature().

Referenced by KillRewarder::_RewardXP(), CheckAreaExploreAndOutdoor(), RewardHonor(), and RewardQuest().

◆ GroupEventHappens()

void Player::GroupEventHappens ( uint32  questId,
WorldObject const *  pEventObject 
)
1819{
1820 if (Group* group = GetGroup())
1821 {
1822 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
1823 {
1824 Player* player = itr->GetSource();
1825
1826 // for any leave or dead (with not released body) group member at appropriate distance
1827 if (player && player->IsAtGroupRewardDistance(pEventObject) && !player->GetCorpse())
1828 player->AreaExploredOrEventHappens(questId);
1829 }
1830 }
1831 else
1833}
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12809
void AreaExploredOrEventHappens(uint32 questId)
Definition PlayerQuest.cpp:1791

References AreaExploredOrEventHappens(), GetCorpse(), GetGroup(), and IsAtGroupRewardDistance().

Referenced by SmartAI::EndPath(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), Map::ScriptsProcess(), SmartAI::StopFollow(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_rinji::npc_rinjiAI::WaypointReached(), npc_corporal_keeshan::npc_corporal_keeshanAI::WaypointReached(), npc_deathstalker_erland::npc_deathstalker_erlandAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached(), npc_gilthares::npc_giltharesAI::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_bonker_togglevolt::npc_bonker_togglevoltAI::WaypointReached(), npc_emily::npc_emilyAI::WaypointReached(), npc_apothecary_hanes::npc_Apothecary_HanesAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::WaypointReached(), npc_bessy::npc_bessyAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), npc_kservant::npc_kservantAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleBaseModValue()

void Player::HandleBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  amount,
bool  apply 
)
5038{
5039 if (modGroup >= BASEMOD_END)
5040 {
5041 LOG_ERROR("entities.player", "ERROR in HandleBaseModValue(): non existed BaseModGroup!");
5042 return;
5043 }
5044
5045 switch (modType)
5046 {
5047 case FLAT_MOD:
5048 m_auraBaseMod[modGroup][modType] += apply ? amount : -amount;
5049 break;
5050 case PCT_MOD:
5051 ApplyPercentModFloatVar(m_auraBaseMod[modGroup][modType], amount, apply);
5052 break;
5053 }
5054
5055 if (!CanModifyStats())
5056 return;
5057
5058 switch (modGroup)
5059 {
5060 case CRIT_PERCENTAGE:
5062 break;
5065 break;
5068 break;
5069 case SHIELD_BLOCK_VALUE:
5071 break;
5072 default:
5073 break;
5074 }
5075}
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Util.h:50
void UpdateShieldBlockValue()
Definition StatSystem.cpp:539
void UpdateCritPercentage(WeaponAttackType attType)
Definition StatSystem.cpp:658

References ApplyPercentModFloatVar(), BASE_ATTACK, BASEMOD_END, Unit::CanModifyStats(), CRIT_PERCENTAGE, FLAT_MOD, LOG_ERROR, m_auraBaseMod, OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PCT_MOD, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, SHIELD_BLOCK_VALUE, UpdateCritPercentage(), and UpdateShieldBlockValue().

Referenced by _ApplyItemBonuses(), _ApplyWeaponDependentAuraCritMod(), ApplyEnchantment(), AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleAuraModWeaponCritPercent(), and AuraEffect::HandleShieldBlockValue().

◆ HandleDrowning()

void Player::HandleDrowning ( uint32  time_diff)
protected
Todo:
: Check this formula
Todo:
: Check this formula
849{
851 return;
852
853 // In water
855 {
856 // Breath timer not activated - activate it
858 {
861 }
862 else // If activated - do tick
863 {
864 m_MirrorTimer[BREATH_TIMER] -= time_diff;
865 // Timer limit - need deal damage
867 {
869 // Calculate and deal damage
871 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
873 }
874 else if (!(m_MirrorTimerFlagsLast & UNDERWATER_INWATER)) // Update time in client if need
876 }
877 }
878 else if (m_MirrorTimer[BREATH_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
879 {
880 int32 UnderWaterTime = getMaxTimer(BREATH_TIMER);
881 // Need breath regen
882 m_MirrorTimer[BREATH_TIMER] += 10 * time_diff;
883 if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive())
887 }
888
889 // In dark water
891 {
892 // Fatigue timer not activated - activate it
894 {
897 }
898 else
899 {
900 m_MirrorTimer[FATIGUE_TIMER] -= time_diff;
901 // Timer limit - need deal damage or teleport ghost to graveyard
903 {
905 if (IsAlive()) // Calculate and deal damage
906 {
907 uint32 damage = GetMaxHealth() / 5 + urand(0, GetLevel() - 1);
909 }
910 else if (HasPlayerFlag(PLAYER_FLAGS_GHOST)) // Teleport ghost to graveyard
912 }
915 }
916 }
917 else if (m_MirrorTimer[FATIGUE_TIMER] != DISABLED_MIRROR_TIMER) // Regen timer
918 {
919 int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER);
920 m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff;
921 if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive())
925 }
926
927 if (m_MirrorTimerFlags & (UNDERWATER_INLAVA /*| UNDERWATER_INSLIME*/) && !(_lastLiquid && _lastLiquid->SpellId))
928 {
929 // Breath timer not activated - activate it
932 else
933 {
934 m_MirrorTimer[FIRE_TIMER] -= time_diff;
935 if (m_MirrorTimer[FIRE_TIMER] < 0)
936 {
937 m_MirrorTimer[FIRE_TIMER] += 2020;
938 // Calculate and deal damage
940 uint32 damage = urand(600, 700);
943 // need to skip Slime damage in Undercity,
944 // maybe someone can find better way to handle environmental damage
945 //else if (m_zoneUpdateId != 1497)
946 // EnvironmentalDamage(DAMAGE_SLIME, damage);
947 }
948 }
949 }
950 else
952
953 // Recheck timers flag
954 m_MirrorTimerFlags &= ~UNDERWATER_EXIST_TIMERS;
955 for (uint8 i = 0; i < MAX_TIMERS; ++i)
957 {
959 break;
960 }
962}
@ DAMAGE_DROWNING
Definition Player.h:830
@ DAMAGE_EXHAUSTED
Definition Player.h:829
@ UNDERWATER_INDARKWATER
Definition Player.h:105
@ UNDERWATER_EXIST_TIMERS
Definition Player.h:107
@ UNDERWATER_INWATER
Definition Player.h:102
@ UNDERWATER_INLAVA
Definition Player.h:103
void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen)
Definition Player.cpp:745
uint32 EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
Definition Player.cpp:768
void RepopAtGraveyard()
Definition Player.cpp:4938
int32 getMaxTimer(MirrorTimerType timer)
Definition Player.cpp:821
void StopMirrorTimer(MirrorTimerType Type)
Definition Player.cpp:756
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2158
uint32 SpellId
Definition DBCStructure.h:1290

References Unit::_lastLiquid, BREATH_TIMER, DAMAGE_DROWNING, DAMAGE_EXHAUSTED, DAMAGE_LAVA, DISABLED_MIRROR_TIMER, EnvironmentalDamage(), FATIGUE_TIMER, FIRE_TIMER, Unit::GetLevel(), Unit::GetMaxHealth(), getMaxTimer(), HasPlayerFlag(), IN_MILLISECONDS, Unit::IsAlive(), m_MirrorTimer, m_MirrorTimerFlags, m_MirrorTimerFlagsLast, MAX_TIMERS, PLAYER_FLAGS_GHOST, RepopAtGraveyard(), SendMirrorTimer(), LiquidTypeEntry::SpellId, StopMirrorTimer(), UNDERWATER_EXIST_TIMERS, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INWATER, and urand().

Referenced by Update().

◆ HandleFall()

void Player::HandleFall ( MovementInfo const &  movementInfo)
13901{
13902 // calculate total z distance of the fall
13903 float z_diff = m_lastFallZ - movementInfo.pos.GetPositionZ();
13904
13905 //Players with low fall distance, Feather Fall or physical immunity (charges used) are ignored
13906 // 14.57 can be calculated by resolving damageperc formula below to 0
13907 if (z_diff >= 14.57f && !isDead() && !IsGameMaster() && !GetCommandStatus(CHEAT_GOD) &&
13909 !HasFlyAura())
13910 {
13911 //Safe fall, fall height reduction
13913
13914 float damageperc = 0.018f * (z_diff - safe_fall) - 0.2426f;
13915 uint32 original_health = GetHealth(), final_damage = 0;
13916
13918 {
13919 uint32 damage = (uint32)(damageperc * GetMaxHealth() * sWorld->getRate(RATE_DAMAGE_FALL));
13920
13921 //float height = movementInfo.pos.m_positionZ;
13922 //UpdateGroundPositionZ(movementInfo.pos.m_positionX, movementInfo.pos.m_positionY, height);
13923
13924 if (damage > 0)
13925 {
13926 //Prevent fall damage from being more than the player maximum health
13927 if (damage > GetMaxHealth())
13928 damage = GetMaxHealth();
13929
13930 // Gust of Wind
13931 if (HasAura(43621))
13932 damage = GetMaxHealth() / 2;
13933
13934 // Divine Protection
13935 if (HasAura(498))
13936 {
13937 damage /= 2;
13938 }
13939
13940 final_damage = EnvironmentalDamage(DAMAGE_FALL, damage);
13941 }
13942
13943 //Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
13944 LOG_DEBUG("entities.player", "FALLDAMAGE mZ={} z={} fallTime={} damage={} SF={}", movementInfo.pos.GetPositionZ(), GetPositionZ(), movementInfo.fallTime, damage, safe_fall);
13945 }
13946
13947 // recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
13948 if (IsAlive() && final_damage < original_health)
13950 }
13951}
@ ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING
Definition DBCEnums.h:139
@ CHEAT_GOD
Definition Player.h:994
@ SPELL_AURA_SAFE_FALL
Definition SpellAuraDefines.h:207
@ RATE_DAMAGE_FALL
Definition WorldConfig.h:466
bool GetCommandStatus(uint32 command) const
Definition Player.h:1184
bool HasFlyAura() const
Definition Unit.h:1758
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12980

References ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, CHEAT_GOD, DAMAGE_FALL, EnvironmentalDamage(), MovementInfo::fallTime, GetCommandStatus(), Unit::GetHealth(), Unit::GetMaxHealth(), Position::GetPositionZ(), Unit::GetTotalAuraModifier(), Unit::HasAura(), Unit::HasFeatherFallAura(), Unit::HasFlyAura(), Unit::HasHoverAura(), Unit::IsAlive(), Unit::isDead(), IsGameMaster(), Unit::IsImmunedToDamageOrSchool(), LOG_DEBUG, m_lastFallZ, MovementInfo::pos, RATE_DAMAGE_FALL, SPELL_AURA_SAFE_FALL, SPELL_SCHOOL_MASK_NORMAL, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::ProcessMovementInfo().

◆ HandleSobering()

void Player::HandleSobering ( )
protected

The player sobers by 1% every 9 seconds.

966{
967 m_drunkTimer = 0;
968
969 uint8 currentDrunkValue = GetDrunkValue();
970 uint8 drunk = currentDrunkValue ? --currentDrunkValue : 0;
971 SetDrunkValue(drunk);
972}
void SetDrunkValue(uint8 newDrunkValue, uint32 itemId=0)
Definition Player.cpp:985

References GetDrunkValue(), m_drunkTimer, and SetDrunkValue().

Referenced by Update().

◆ Has310Flyer()

bool Player::Has310Flyer ( bool  checkAllSpells,
uint32  excludeSpellId = 0 
)
3498{
3499 if (!checkAllSpells)
3501 else
3502 {
3503 SetHas310Flyer(false);
3504 SpellInfo const* spellInfo;
3505 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
3506 {
3507 // pussywizard:
3508 if (itr->second->State == PLAYERSPELL_REMOVED)
3509 continue;
3510
3511 if (itr->first == excludeSpellId)
3512 continue;
3513
3514 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(itr->first);
3515 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3516 {
3517 if (_spell_idx->second->SkillLine != SKILL_MOUNTS)
3518 break; // We can break because mount spells belong only to one skillline (at least 310 flyers do)
3519
3520 spellInfo = sSpellMgr->AssertSpellInfo(itr->first);
3521 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3522 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3523 spellInfo->Effects[i].CalcValue() == 310)
3524 {
3525 SetHas310Flyer(true);
3526 return true;
3527 }
3528 }
3529 }
3530 }
3531
3532 return false;
3533}
@ PLAYER_EXTRA_HAS_310_FLYER
Definition Player.h:584

References SpellInfo::Effects, m_ExtraFlags, m_spells, MAX_SPELL_EFFECTS, PLAYER_EXTRA_HAS_310_FLYER, PLAYERSPELL_REMOVED, SetHas310Flyer(), SKILL_MOUNTS, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, and sSpellMgr.

Referenced by _addSpell(), and removeSpell().

◆ HasAchieved()

bool Player::HasAchieved ( uint32  achievementId) const

◆ HasActivePowerType()

bool Player::HasActivePowerType ( Powers  power)
overridevirtual

Reimplemented from Unit.

2744{
2745 if (sScriptMgr->OnPlayerHasActivePowerType(this, power))
2746 return true;
2747 else
2748 return (getPowerType() == power);
2749}

References Unit::getPowerType(), and sScriptMgr.

Referenced by Create(), and ResetAllPowers().

◆ HasActiveSpell()

bool Player::HasActiveSpell ( uint32  spell) const
3904{
3905 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3906 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->Active && itr->second->IsInSpec(m_activeSpec));
3907}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by _AddSpellCooldown(), ActivateSpec(), spell_dk_dancing_rune_weapon::CheckProc(), WorldSession::HandleCastSpellOpcode(), and learnSpell().

◆ HasAtLoginFlag()

◆ HasCasterSpec()

bool Player::HasCasterSpec ( )
16125{
16126 switch (GetSpec(GetActiveSpec()))
16127 {
16140 return true;
16141 default:
16142 break;
16143 }
16144 return false;
16145}
@ TALENT_TREE_HUNTER_SURVIVAL
Definition Player.h:154
@ TALENT_TREE_MAGE_FIRE
Definition Player.h:168
@ TALENT_TREE_PRIEST_SHADOW
Definition Player.h:160
@ TALENT_TREE_SHAMAN_ELEMENTAL
Definition Player.h:164
@ TALENT_TREE_HUNTER_BEAST_MASTERY
Definition Player.h:152
@ TALENT_TREE_WARLOCK_DEMONOLOGY
Definition Player.h:171
@ TALENT_TREE_WARLOCK_DESTRUCTION
Definition Player.h:172
@ TALENT_TREE_WARLOCK_AFFLICTION
Definition Player.h:170
@ TALENT_TREE_MAGE_ARCANE
Definition Player.h:167
@ TALENT_TREE_MAGE_FROST
Definition Player.h:169
@ TALENT_TREE_DRUID_BALANCE
Definition Player.h:173
@ TALENT_TREE_HUNTER_MARKSMANSHIP
Definition Player.h:153
uint32 GetSpec(int8 spec=-1)
Definition Player.cpp:16026

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_BALANCE, TALENT_TREE_HUNTER_BEAST_MASTERY, TALENT_TREE_HUNTER_MARKSMANSHIP, TALENT_TREE_HUNTER_SURVIVAL, TALENT_TREE_MAGE_ARCANE, TALENT_TREE_MAGE_FIRE, TALENT_TREE_MAGE_FROST, TALENT_TREE_PRIEST_SHADOW, TALENT_TREE_SHAMAN_ELEMENTAL, TALENT_TREE_WARLOCK_AFFLICTION, TALENT_TREE_WARLOCK_DEMONOLOGY, and TALENT_TREE_WARLOCK_DESTRUCTION.

◆ HasCorpse()

◆ HasDelayedTeleport()

bool Player::HasDelayedTeleport ( ) const
inlineprivate
2962{ return m_bHasDelayedTeleport; }

References m_bHasDelayedTeleport.

Referenced by Update().

◆ HasEnoughMoney() [1/2]

bool Player::HasEnoughMoney ( int32  amount) const
inline
1607 {
1608 if (amount > 0)
1609 return (GetMoney() >= (uint32) amount);
1610 return true;
1611 }

References GetMoney().

◆ HasEnoughMoney() [2/2]

◆ HasFreeBattlegroundQueueId()

bool Player::HasFreeBattlegroundQueueId ( ) const

◆ HasHealSpec()

bool Player::HasHealSpec ( )
16148{
16149 switch (GetSpec(GetActiveSpec()))
16150 {
16156 return true;
16157 default:
16158 break;
16159 }
16160 return false;
16161}
@ TALENT_TREE_DRUID_RESTORATION
Definition Player.h:175
@ TALENT_TREE_SHAMAN_RESTORATION
Definition Player.h:166
@ TALENT_TREE_PRIEST_HOLY
Definition Player.h:159
@ TALENT_TREE_PALADIN_HOLY
Definition Player.h:149
@ TALENT_TREE_PRIEST_DISCIPLINE
Definition Player.h:158

References GetActiveSpec(), GetSpec(), TALENT_TREE_DRUID_RESTORATION, TALENT_TREE_PALADIN_HOLY, TALENT_TREE_PRIEST_DISCIPLINE, TALENT_TREE_PRIEST_HOLY, and TALENT_TREE_SHAMAN_RESTORATION.

◆ HasItemCount()

bool Player::HasItemCount ( uint32  item,
uint32  count = 1,
bool  inBankAlso = false 
) const
657{
658 uint32 tempcount = 0;
660 {
662 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
663 {
664 tempcount += pItem->GetCount();
665 if (tempcount >= count)
666 return true;
667 }
668 }
670 {
672 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
673 {
674 tempcount += pItem->GetCount();
675 if (tempcount >= count)
676 return true;
677 }
678 }
680 {
681 if (Bag* pBag = GetBagByPos(i))
682 {
683 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
684 {
685 Item* pItem = GetItemByPos(i, j);
686 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
687 {
688 tempcount += pItem->GetCount();
689 if (tempcount >= count)
690 return true;
691 }
692 }
693 }
694 }
695
696 if (inBankAlso)
697 {
699 {
701 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
702 {
703 tempcount += pItem->GetCount();
704 if (tempcount >= count)
705 return true;
706 }
707 }
709 {
710 if (Bag* pBag = GetBagByPos(i))
711 {
712 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
713 {
714 Item* pItem = GetItemByPos(i, j);
715 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
716 {
717 tempcount += pItem->GetCount();
718 if (tempcount >= count)
719 return true;
720 }
721 }
722 }
723 }
724 }
725
726 return false;
727}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), Item::GetCount(), Object::GetEntry(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, Item::IsInTrade(), and KEYRING_SLOT_START.

Referenced by LootItem::AllowedForPlayer(), BuyItemFromVendorSlot(), CanCompleteRepeatableQuest(), Spell::CheckItems(), spell_dk_raise_dead::CheckReagents(), Spell::EffectCreateItem2(), GetResurrectionSpellId(), go_soulwell::go_soulwellAI::GossipHello(), go_celestial_planetarium_access::go_celestial_planetarium_accessAI::GossipHello(), misc_commandscript::HandleAddItemCommand(), lfg::LFGMgr::InitializeLockedDungeons(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_lokhtos_darkbargainer::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npcs_flanis_swiftwing_and_kagrosh::OnGossipHello(), npc_artorius::OnGossipHello(), npc_simone::OnGossipHello(), npc_nelson::OnGossipHello(), npc_franklin::OnGossipHello(), npc_taxi::OnGossipHello(), npc_locksmith::OnGossipHello(), npc_oculus_drakegiver::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_twilight_grove::OnTrigger(), NPCStaveQuestAI::QuestIncomplete(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), Satisfy(), npc_aquementas::npc_aquementasAI::SendItem(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and Spell::WriteCastResultInfo().

◆ HasItemFitToSpellRequirements()

bool Player::HasItemFitToSpellRequirements ( SpellInfo const *  spellInfo,
Item const *  ignoreItem = nullptr 
) const
12569{
12570 if (spellInfo->EquippedItemClass < 0)
12571 return true;
12572
12573 // scan other equipped items for same requirements (mostly 2 daggers/etc)
12574 // for optimize check 2 used cases only
12575 switch (spellInfo->EquippedItemClass)
12576 {
12577 case ITEM_CLASS_WEAPON:
12578 {
12581 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12582 return true;
12583 break;
12584 }
12585 case ITEM_CLASS_ARMOR:
12586 {
12587 // tabard not have dependent spells
12590 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12591 return true;
12592
12593 // shields can be equipped to offhand slot
12595 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12596 return true;
12597
12598 // ranged slot can have some armor subclasses
12600 if (item != ignoreItem && item->IsFitToSpellRequirements(spellInfo))
12601 return true;
12602
12603 break;
12604 }
12605 default:
12606 LOG_ERROR("entities.player", "HasItemFitToSpellRequirements: Not handled spell requirement for item class {}", spellInfo->EquippedItemClass);
12607 break;
12608 }
12609
12610 return false;
12611}

References EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, EQUIPMENT_SLOT_START, EQUIPMENT_SLOT_TABARD, SpellInfo::EquippedItemClass, GetUseableItemByPos(), INVENTORY_SLOT_BAG_0, Item::IsFitToSpellRequirements(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, and LOG_ERROR.

Referenced by Unit::CalcArmorReducedDamage(), Spell::CheckItems(), and RemoveItemDependentAurasAndCasts().

◆ HasItemOrGemWithIdEquipped()

bool Player::HasItemOrGemWithIdEquipped ( uint32  item,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
730{
731 uint32 tempcount = 0;
733 {
734 if (i == except_slot)
735 continue;
736
738 if (pItem && pItem->GetEntry() == item)
739 {
740 tempcount += pItem->GetCount();
741 if (tempcount >= count)
742 return true;
743 }
744 }
745
746 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item);
747 if (pProto && pProto->GemProperties)
748 {
750 {
751 if (i == except_slot)
752 continue;
753
755 if (pItem && pItem->GetTemplate()->Socket[0].Color)
756 {
757 tempcount += pItem->GetGemCountWithID(item);
758 if (tempcount >= count)
759 return true;
760 }
761 }
762 }
763
764 return false;
765}
uint8 GetGemCountWithID(uint32 GemID) const
Definition Item.cpp:1014

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, ItemTemplate::GemProperties, Item::GetCount(), Object::GetEntry(), Item::GetGemCountWithID(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, sObjectMgr, and ItemTemplate::Socket.

Referenced by npc_eris_hevenfire::npc_eris_hevenfireAI::CanBeSeen(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::CanBeSeen(), CanEquipUniqueItem(), achievement_pb_pilgrims_peril::OnCheck(), and achievement_pb_terokkar_turkey_time::OnCheck().

◆ HasItemOrGemWithLimitCategoryEquipped()

bool Player::HasItemOrGemWithLimitCategoryEquipped ( uint32  limitCategory,
uint32  count,
uint8  except_slot = NULL_SLOT 
) const
768{
769 uint32 tempcount = 0;
771 {
772 if (i == except_slot)
773 continue;
774
776 if (!pItem)
777 continue;
778
779 ItemTemplate const* pProto = pItem->GetTemplate();
780 if (!pProto)
781 continue;
782
783 if (pProto->ItemLimitCategory == limitCategory)
784 {
785 tempcount += pItem->GetCount();
786 if (tempcount >= count)
787 return true;
788 }
789
791 {
792 tempcount += pItem->GetGemCountWithLimitCategory(limitCategory);
793 if (tempcount >= count)
794 return true;
795 }
796 }
797
798 return false;
799}

References _Socket::Color, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetCount(), Item::GetEnchantmentId(), Item::GetGemCountWithLimitCategory(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, ItemTemplate::ItemLimitCategory, PRISMATIC_ENCHANTMENT_SLOT, and ItemTemplate::Socket.

Referenced by CanEquipUniqueItem().

◆ HasItemTotemCategory()

bool Player::HasItemTotemCategory ( uint32  TotemCategory) const
853{
854 Item* pItem;
856 {
859 return true;
860 }
862 {
865 return true;
866 }
868 {
869 if (Bag* pBag = GetBagByPos(i))
870 {
871 for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
872 {
873 pItem = GetItemByPos(i, j);
875 return true;
876 }
877 }
878 }
879 return false;
880}
TotemCategory
Definition SharedDefines.h:3333
bool IsTotemCategoryCompatiableWith(ItemTemplate const *pProto, uint32 requiredTotemCategoryId) const
Definition PlayerStorage.cpp:882

References CURRENCYTOKEN_SLOT_END, EQUIPMENT_SLOT_START, GetBagByPos(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, IsTotemCategoryCompatiableWith(), and KEYRING_SLOT_START.

Referenced by Spell::CheckItems().

◆ HasMeleeSpec()

bool Player::HasMeleeSpec ( )
16102{
16103 switch (GetSpec(GetActiveSpec()))
16104 {
16114 return true;
16116 if (GetShapeshiftForm() == FORM_CAT)
16117 return true;
16118 default:
16119 break;
16120 }
16121 return false;
16122}
@ TALENT_TREE_DEATH_KNIGHT_FROST
Definition Player.h:162
@ TALENT_TREE_DRUID_FERAL_COMBAT
Definition Player.h:174
@ TALENT_TREE_WARRIOR_FURY
Definition Player.h:147
@ TALENT_TREE_ROGUE_ASSASSINATION
Definition Player.h:155
@ TALENT_TREE_DEATH_KNIGHT_UNHOLY
Definition Player.h:163
@ TALENT_TREE_SHAMAN_ENHANCEMENT
Definition Player.h:165
@ TALENT_TREE_WARRIOR_ARMS
Definition Player.h:146
@ TALENT_TREE_ROGUE_COMBAT
Definition Player.h:156
@ TALENT_TREE_PALADIN_RETRIBUTION
Definition Player.h:151
@ TALENT_TREE_ROGUE_SUBTLETY
Definition Player.h:157
@ FORM_CAT
Definition UnitDefines.h:70

References FORM_CAT, GetActiveSpec(), Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_FROST, TALENT_TREE_DEATH_KNIGHT_UNHOLY, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_RETRIBUTION, TALENT_TREE_ROGUE_ASSASSINATION, TALENT_TREE_ROGUE_COMBAT, TALENT_TREE_ROGUE_SUBTLETY, TALENT_TREE_SHAMAN_ENHANCEMENT, TALENT_TREE_WARRIOR_ARMS, and TALENT_TREE_WARRIOR_FURY.

◆ HasPendingBind()

◆ HasPendingSpectatorForBG()

bool Player::HasPendingSpectatorForBG ( uint32  bgInstanceId) const
inline
2580{ return m_pendingSpectatorForBG == bgInstanceId; }

References m_pendingSpectatorForBG.

Referenced by WorldSession::HandleMoveWorldportAck().

◆ HasPlayerFlag()

◆ HasPvPForcingQuest()

bool Player::HasPvPForcingQuest ( ) const
2496{
2497 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2498 {
2499 uint32 questId = GetQuestSlotQuestId(i);
2500 if (questId == 0)
2501 continue;
2502
2503 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
2504 if (!quest)
2505 continue;
2506
2507 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
2508 return true;
2509 }
2510
2511 return false;
2512}

References GetQuestSlotQuestId(), Quest::HasFlag(), MAX_QUEST_LOG_SIZE, QUEST_FLAGS_FLAGS_PVP, and sObjectMgr.

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), and UpdateZone().

◆ HasQuest()

bool Player::HasQuest ( uint32  questId) const
102{
103 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
104 {
105 uint32 questid = GetQuestSlotQuestId(i);
106 if (questid == questId)
107 {
108 return true;
109 }
110 }
111
112 return false;
113}

References GetQuestSlotQuestId(), and MAX_QUEST_LOG_SIZE.

Referenced by spell_portal_effect_acherus::CheckCast().

◆ HasQuestForGO()

bool Player::HasQuestForGO ( int32  GOId) const
12433{
12434 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
12435 {
12436 uint32 questid = GetQuestSlotQuestId(i);
12437 if (questid == 0)
12438 continue;
12439
12440 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
12441 if (qs_itr == m_QuestStatus.end())
12442 continue;
12443
12444 QuestStatusData const& qs = qs_itr->second;
12445
12447 {
12448 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
12449 if (!qinfo)
12450 continue;
12451
12452 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
12453 continue;
12454
12455 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
12456 {
12457 if (qinfo->RequiredNpcOrGo[j] >= 0) //skip non GO case
12458 continue;
12459
12460 if ((-1)*GOId == qinfo->RequiredNpcOrGo[j] && qs.CreatureOrGOCount[j] < qinfo->RequiredNpcOrGoCount[j])
12461 return true;
12462 }
12463 }
12464 }
12465 return false;
12466}
Difficulty GetDifficulty(bool isRaid) const
Definition Player.h:1915
bool IsAllowedInRaid(Difficulty difficulty) const
Definition QuestDef.cpp:296

References QuestStatusData::CreatureOrGOCount, GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::IsAllowedInRaid(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::ActivateToQuest().

◆ HasQuestForItem()

bool Player::HasQuestForItem ( uint32  itemId,
uint32  excludeQuestId = 0,
bool  turnIn = false,
bool *  showInLoot = nullptr 
) const
2265{
2266 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2267 {
2268 uint32 questid = GetQuestSlotQuestId(i);
2269 if (questid == 0 || questid == excludeQuestId)
2270 continue;
2271
2272 QuestStatusMap::const_iterator qs_itr = m_QuestStatus.find(questid);
2273 if (qs_itr == m_QuestStatus.end())
2274 continue;
2275
2276 QuestStatusData const& q_status = qs_itr->second;
2277
2278 if ((q_status.Status == QUEST_STATUS_INCOMPLETE) || (turnIn && q_status.Status == QUEST_STATUS_COMPLETE))
2279 {
2280 Quest const* qinfo = sObjectMgr->GetQuestTemplate(questid);
2281 if (!qinfo)
2282 continue;
2283
2284 // hide quest if player is in raid-group and quest is no raid quest
2285 if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
2286 {
2287 if (!InBattleground() && !GetGroup()->isBFGroup()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
2288 {
2289 continue;
2290 }
2291 }
2292
2293 // There should be no mixed ReqItem/ReqSource drop
2294 // This part for ReqItem drop
2295 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
2296 {
2297 if (itemid == qinfo->RequiredItemId[j] && q_status.ItemCount[j] < qinfo->RequiredItemCount[j])
2298 {
2299 if (showInLoot)
2300 {
2301 if (GetItemCount(itemid, true) < qinfo->RequiredItemCount[j])
2302 {
2303 return true;
2304 }
2305
2306 *showInLoot = false;
2307 }
2308 else
2309 {
2310 return true;
2311 }
2312 }
2313
2314 if (turnIn && q_status.ItemCount[j] >= qinfo->RequiredItemCount[j])
2315 {
2316 return true;
2317 }
2318 }
2319 // This part - for ReqSource
2320 for (uint8 j = 0; j < QUEST_SOURCE_ITEM_IDS_COUNT; ++j)
2321 {
2322 // examined item is a source item
2323 if (qinfo->ItemDrop[j] == itemid)
2324 {
2325 ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(itemid);
2326 uint32 ownedCount = GetItemCount(itemid, true);
2327 // 'unique' item
2328 if ((pProto->MaxCount && int32(ownedCount) < pProto->MaxCount) || (turnIn && int32(ownedCount) >= pProto->MaxCount))
2329 return true;
2330
2331 // allows custom amount drop when not 0
2332 if (qinfo->ItemDropQuantity[j])
2333 {
2334 if ((ownedCount < qinfo->ItemDropQuantity[j]) || (turnIn && ownedCount >= qinfo->ItemDropQuantity[j]))
2335 return true;
2336 }
2337 else if (ownedCount < pProto->GetMaxStackSize())
2338 return true;
2339 }
2340 }
2341 }
2342 }
2343 return false;
2344}
uint32 ItemDropQuantity[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:303
uint32 ItemDrop[QUEST_SOURCE_ITEM_IDS_COUNT]
Definition QuestDef.h:302
uint32 RequiredItemId[QUEST_ITEM_OBJECTIVES_COUNT]
Definition QuestDef.h:300

References GetDifficulty(), GetGroup(), GetItemCount(), WorldObject::GetMap(), GetQuestSlotQuestId(), InBattleground(), Quest::IsAllowedInRaid(), QuestStatusData::ItemCount, Quest::ItemDrop, Quest::ItemDropQuantity, m_QuestStatus, MAX_QUEST_LOG_SIZE, ItemTemplate::MaxCount, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and QuestStatusData::Status.

Referenced by LootItem::AllowedForPlayer(), LootTemplate::HasQuestDropForPlayer(), LootTemplate::LootGroup::HasQuestDropForPlayer(), at_twilight_grove::OnTrigger(), and RewardQuest().

◆ HasReceivedSpectatorResetFor()

bool Player::HasReceivedSpectatorResetFor ( ObjectGuid  guid)
inline

◆ HasRestFlag()

bool Player::HasRestFlag ( RestFlag  restFlag) const
inline
1203{ return (_restFlagMask & restFlag) != 0; }

References _restFlagMask.

Referenced by Update().

◆ HasSkill()

◆ HasSpell()

bool Player::HasSpell ( uint32  spell) const
overridevirtual

Reimplemented from Unit.

3892{
3893 PlayerSpellMap::const_iterator itr = m_spells.find(spell);
3894 return (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3895}

References m_activeSpec, m_spells, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), AddSpellAndCategoryCooldowns(), LootItem::AllowedForPlayer(), canCreateExtraItems(), CanCreatePerfectItem(), canFlyInZone(), Group::CanJoinBattlegroundQueue(), npc_engineering_tele_trinket::CanLearn(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::EffectCastButtons(), GetExplicitDiscoverySpell(), GetResurrectionSpellId(), GetSkillDiscoverySpell(), GetStartPosition(), GetTrainerSpellState(), WorldSession::HandleBattlemasterJoinOpcode(), Acore::PlayerCommand::HandleLearnSpellCommand(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleTrainerBuySpellOpcode(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), npc_prof_alchemy::HasAlchemySpell(), HasDiscoveredAllSpells(), npc_prof_leather::HasLeatherSpecialty(), go_evil_book_for_dummies::HasLeatherSpecialty(), npc_prof_tailor::HasTailorSpell(), npc_prof_blacksmith::HasWeaponSub(), IsActionButtonDataValid(), Creature::IsValidTrainerForPlayer(), learnQuestRewardedSpells(), boss_gloomrel::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), ProcessCastaction(), resetTalents(), WorldSession::SendTrainerList(), and TeleportTo().

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

bool Player::HasSpellItemCooldown ( uint32  spell_id,
uint32  itemid 
) const
overridevirtual

Reimplemented from Unit.

16367{
16368 SpellCooldowns::const_iterator itr = m_spellCooldowns.find(spell_id);
16369 return itr != m_spellCooldowns.end() && itr->second.end > getMSTime() && itr->second.itemid == itemid;
16370}

References getMSTime(), and m_spellCooldowns.

◆ HasSpellMod()

bool Player::HasSpellMod ( SpellModifier mod,
Spell spell 
)
9789{
9790 if (!mod || !spell)
9791 return false;
9792
9793 return spell->m_appliedMods.find(mod->ownerAura) != spell->m_appliedMods.end();
9794}

References Spell::m_appliedMods, and SpellModifier::ownerAura.

Referenced by ApplySpellMod().

◆ HasTalent()

bool Player::HasTalent ( uint32  spell_id,
uint8  spec 
) const
3898{
3899 PlayerTalentMap::const_iterator itr = m_talents.find(spell);
3900 return (itr != m_talents.end() && itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(m_activeSpec));
3901}

References m_activeSpec, m_talents, and PLAYERSPELL_REMOVED.

Referenced by ActivateSpec(), GetSpec(), AuraEffect::HandleShapeshiftBoosts(), and LearnTalent().

◆ HasTankSpec()

bool Player::HasTankSpec ( )
16084{
16085 switch (GetSpec())
16086 {
16090 return true;
16093 return true;
16094 break;
16095 default:
16096 break;
16097 }
16098 return false;
16099}
@ TALENT_TREE_DEATH_KNIGHT_BLOOD
Definition Player.h:161
@ TALENT_TREE_PALADIN_PROTECTION
Definition Player.h:150
@ TALENT_TREE_WARRIOR_PROTECTION
Definition Player.h:148
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_BEAR
Definition UnitDefines.h:74

References FORM_BEAR, FORM_DIREBEAR, Unit::GetShapeshiftForm(), GetSpec(), TALENT_TREE_DEATH_KNIGHT_BLOOD, TALENT_TREE_DRUID_FERAL_COMBAT, TALENT_TREE_PALADIN_PROTECTION, and TALENT_TREE_WARRIOR_PROTECTION.

◆ HasTitle() [1/2]

bool Player::HasTitle ( CharTitlesEntry const *  title) const
inline
2546{ return HasTitle(title->bit_index); }
bool HasTitle(uint32 bitIndex) const
Definition Player.cpp:13372

References CharTitlesEntry::bit_index, and HasTitle().

Referenced by HasTitle().

◆ HasTitle() [2/2]

bool Player::HasTitle ( uint32  bitIndex) const
13373{
13374 if (bitIndex > MAX_TITLE_INDEX)
13375 return false;
13376
13377 uint32 fieldIndexOffset = bitIndex / 32;
13378 uint32 flag = 1 << (bitIndex % 32);
13379 return HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13380}
#define MAX_TITLE_INDEX
Definition Player.h:548

References Object::HasFlag(), MAX_TITLE_INDEX, and PLAYER__FIELD_KNOWN_TITLES.

Referenced by character_commandscript::HandleCharacterTitlesCommand(), lookup_commandscript::HandleLookupTitleCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), LoadFromDB(), and AchievementCriteriaData::Meets().

◆ HasWeapon()

bool Player::HasWeapon ( WeaponAttackType  type) const
inlineoverridevirtual

Implements Unit.

1257{ return GetWeaponForAttack(type, false); }

References GetWeaponForAttack().

◆ HasWeaponForAttack()

bool Player::HasWeaponForAttack ( WeaponAttackType  type) const
inlineoverridevirtual

Reimplemented from Unit.

1258{ return (Unit::HasWeaponForAttack(type) && GetWeaponForAttack(type, true)); }
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:966

References GetWeaponForAttack(), and Unit::HasWeaponForAttack().

◆ HaveAtClient() [1/2]

bool Player::HaveAtClient ( ObjectGuid  guid) const
11444{
11445 if (guid == GetGUID())
11446 return true;
11447
11449}
VisibleWorldObjectsMap * GetVisibleWorldObjectsMap()
Definition ObjectVisibilityContainer.h:59

References Object::GetGUID(), WorldObject::GetObjectVisibilityContainer(), and ObjectVisibilityContainer::GetVisibleWorldObjectsMap().

◆ HaveAtClient() [2/2]

bool Player::HaveAtClient ( WorldObject const *  u) const
11432{
11433 // Motion Transports are always present in player's client
11434 if (GameObject const* gameobject = u->ToGameObject())
11435 {
11436 if (gameobject->IsMotionTransport())
11437 return true;
11438 }
11439
11440 return HaveAtClient(u->GetGUID());
11441}
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11431

References Object::GetGUID(), HaveAtClient(), and Object::ToGameObject().

Referenced by Group::AddMember(), ArenaSpectator::HandleSpectatorWatchCommand(), HaveAtClient(), Map::SendInitSelf(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SetOwnerGUID(), UpdateVisibilityOf(), and UpdateVisibilityOf().

◆ InArena()

bool Player::InArena ( ) const
12348{
12350 if (!bg || !bg->isArena())
12351 return false;
12352
12353 return true;
12354}
bool isArena() const
Definition Battleground.h:404

References GetBattleground(), and Battleground::isArena().

Referenced by CreateCorpse(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleUseItemOpcode(), achievement_arena_by_type::OnCheck(), RewardHonor(), and AuraEffect::UpdatePeriodic().

◆ InBattleground()

◆ InBattlegroundQueue()

bool Player::InBattlegroundQueue ( bool  ignoreArena = false) const

◆ InBattlegroundQueueForBattlegroundQueueType()

bool Player::InBattlegroundQueueForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12290{
12292}
uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12271

References GetBattlegroundQueueIndex(), and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by Group::CanJoinBattlegroundQueue(), and WorldSession::HandleBattlemasterJoinOpcode().

◆ IncompleteQuest()

◆ InitDataForForm()

void Player::InitDataForForm ( bool  reapplyMods = false)
10592{
10594
10595 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
10596 if (ssEntry && ssEntry->attackSpeed)
10597 {
10601 }
10602 else
10604
10605 switch (form)
10606 {
10607 case FORM_GHOUL:
10608 case FORM_CAT:
10609 {
10610 if (getPowerType() != POWER_ENERGY)
10612 break;
10613 }
10614 case FORM_BEAR:
10615 case FORM_DIREBEAR:
10616 {
10617 if (getPowerType() != POWER_RAGE)
10619 break;
10620 }
10621 default: // 0, for example
10622 {
10623 ChrClassesEntry const* cEntry = sChrClassesStore.LookupEntry(getClass());
10624 if (cEntry && cEntry->powerType < MAX_POWERS && uint32(getPowerType()) != cEntry->powerType)
10625 setPowerType(Powers(cEntry->powerType));
10626 break;
10627 }
10628 }
10629
10630 // update auras at form change, ignore this at mods reapply (.reset stats/etc) when form not change.
10631 if (!reapplyMods)
10633
10636}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
ShapeshiftForm
Definition UnitDefines.h:68
@ FORM_GHOUL
Definition UnitDefines.h:76
void SetRegularAttackTime()
Definition Player.cpp:5312
void UpdateEquipSpellsAtFormChange()
Definition PlayerUpdates.cpp:1355
void setPowerType(Powers power)
Definition Unit.cpp:10030
Definition DBCStructure.h:1818
uint32 attackSpeed
Definition DBCStructure.h:1826

References SpellShapeshiftFormEntry::attackSpeed, BASE_ATTACK, BASE_ATTACK_TIME, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_GHOUL, Unit::getClass(), Unit::getPowerType(), Unit::GetShapeshiftForm(), MAX_POWERS, OFF_ATTACK, POWER_ENERGY, POWER_RAGE, ChrClassesEntry::powerType, RANGED_ATTACK, sChrClassesStore, Unit::SetAttackTime(), Unit::setPowerType(), SetRegularAttackTime(), sSpellShapeshiftFormStore, UpdateAttackPowerAndDamage(), and UpdateEquipSpellsAtFormChange().

Referenced by AuraEffect::HandleAuraModShapeshift(), and InitStatsForLevel().

◆ InitDisplayIds()

void Player::InitDisplayIds ( )
10639{
10640 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
10641 if (!info)
10642 {
10643 LOG_ERROR("entities.player", "Player {} has incorrect race/class pair. Can't init display ids.", GetGUID().ToString());
10644 return;
10645 }
10646
10647 uint8 gender = getGender();
10648 switch (gender)
10649 {
10650 case GENDER_FEMALE:
10653 break;
10654 case GENDER_MALE:
10657 break;
10658 default:
10659 LOG_ERROR("entities.player", "Invalid gender {} for player", gender);
10660 return;
10661 }
10662}
@ GENDER_MALE
Definition SharedDefines.h:61
@ GENDER_FEMALE
Definition SharedDefines.h:62
uint8 getGender() const
Definition Unit.h:831
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16788
void SetNativeDisplayId(uint32 displayId)
Definition Unit.h:1932
uint16 displayId_m
Definition Player.h:341
uint16 displayId_f
Definition Player.h:342

References PlayerInfo::displayId_f, PlayerInfo::displayId_m, GENDER_FEMALE, GENDER_MALE, Unit::getClass(), Unit::getGender(), Object::GetGUID(), Unit::getRace(), LOG_ERROR, Unit::SetDisplayId(), Unit::SetNativeDisplayId(), sObjectMgr, and Position::ToString().

Referenced by Create(), modify_commandscript::HandleModifyGenderCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), and LoadFromDB().

◆ InitGlyphsForLevel()

void Player::InitGlyphsForLevel ( )
13334{
13335 for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows(); ++i)
13336 if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i))
13337 if (gs->Order)
13338 SetGlyphSlot(gs->Order - 1, gs->Id);
13339
13340 uint8 level = GetLevel();
13341 uint32 value = 0;
13342
13343 // 0x3F = 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x20 for 80 level
13344 if (level >= 15)
13345 value |= (0x01 | 0x02);
13346 if (level >= 30)
13347 value |= 0x08;
13348 if (level >= 50)
13349 value |= 0x04;
13350 if (level >= 70)
13351 value |= 0x10;
13352 if (level >= 80)
13353 value |= 0x20;
13354
13356}
@ PLAYER_GLYPHS_ENABLED
Definition UpdateFields.h:390
void SetGlyphSlot(uint8 slot, uint32 slottype)
Definition Player.h:1752

References Unit::GetLevel(), PLAYER_GLYPHS_ENABLED, SetGlyphSlot(), Unit::SetUInt32Value(), and sGlyphSlotStore.

Referenced by Create(), GiveLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ Initialize()

void Player::Initialize ( ObjectGuid::LowType  guid)
4787{
4789}

References Object::_Create(), and Player.

◆ InitPrimaryProfessions()

void Player::InitPrimaryProfessions ( )
11521{
11523}
@ CONFIG_MAX_PRIMARY_TRADE_SKILL
Definition WorldConfig.h:205

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SetFreePrimaryProfessions(), and sWorld.

Referenced by Create(), and LoadFromDB().

◆ InitRunes()

void Player::InitRunes ( )
13504{
13506 return;
13507
13508 m_runes = new Runes;
13509
13510 m_runes->runeState = 0;
13512
13513 for (uint8 i = 0; i < MAX_RUNES; ++i)
13514 {
13515 SetBaseRune(i, runeSlotTypes[i]); // init base types
13516 SetCurrentRune(i, runeSlotTypes[i]); // init current types
13517 SetRuneCooldown(i, 0); // reset cooldowns
13518 SetGracePeriod(i, 0); // xinef: reset grace period
13519 SetRuneConvertAura(i, nullptr);
13521 }
13522
13523 for (uint8 i = 0; i < NUM_RUNE_TYPES; ++i)
13525}
static RuneType runeSlotTypes[MAX_RUNES]
Definition Player.cpp:13493
@ NUM_RUNE_TYPES
Definition Player.h:409
@ RUNE_BLOOD
Definition Player.h:405
#define MAX_RUNES
Definition Player.h:394
@ PLAYER_RUNE_REGEN_1
Definition UpdateFields.h:386
void SetRuneCooldown(uint8 index, uint32 cooldown)
Definition Player.h:2520
void SetBaseRune(uint8 index, RuneType baseRune)
Definition Player.h:2518
void SetGracePeriod(uint8 index, uint32 period)
Definition Player.h:2521
Definition Player.h:422
void SetRuneState(uint8 index, bool set=true)
Definition Player.h:427

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, IsClass(), Runes::lastUsedRune, m_runes, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, RUNE_BLOOD, runeSlotTypes, Runes::runeState, SetBaseRune(), SetCurrentRune(), Object::SetFloatValue(), SetGracePeriod(), SetRuneConvertAura(), SetRuneCooldown(), and Runes::SetRuneState().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitStatsForLevel()

void Player::InitStatsForLevel ( bool  reapplyMods = false)
2576{
2577 if (reapplyMods) //reapply stats values only on .reset stats (level) command
2579
2580 PlayerClassLevelInfo classInfo;
2581 sObjectMgr->GetPlayerClassLevelInfo(getClass(), GetLevel(), &classInfo);
2582
2583 PlayerLevelInfo info;
2584 sObjectMgr->GetPlayerLevelInfo(getRace(true), getClass(), GetLevel(), &info);
2585
2586 uint32 maxPlayerLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL);
2587 sScriptMgr->OnPlayerSetMaxLevel(this, maxPlayerLevel);
2588 SetUInt32Value(PLAYER_FIELD_MAX_LEVEL, maxPlayerLevel);
2590
2591 // reset before any aura state sources (health set/aura apply)
2593
2595
2596 // set default cast time multiplier
2598
2599 // reset size before reapply auras
2600 SetObjectScale(1.0f);
2601
2602 // save base values (bonuses already included in stored stats
2603 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2604 SetCreateStat(Stats(i), info.stats[i]);
2605
2606 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
2607 SetStat(Stats(i), info.stats[i]);
2608
2609 SetCreateHealth(classInfo.basehealth);
2610
2611 //set create powers
2612 SetCreateMana(classInfo.basemana);
2613
2615
2617
2618 //reset rating fields values
2620 SetUInt32Value(index, 0);
2621
2623 for (uint8 i = 0; i < 7; ++i)
2624 {
2628 }
2629
2630 //reset attack power, damage and attack speed fields
2632 SetFloatValue(UNIT_FIELD_BASEATTACKTIME + 1, 2000.0f); // offhand attack time
2634
2641
2648
2649 // Base crit values (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2653
2654 // Init spell schools (will be recalculated in UpdateAllStats() at loading and in _ApplyAllStatBonuses() at reset
2655 for (uint8 i = 0; i < 7; ++i)
2657
2661
2662 // Dodge percentage
2664
2665 // set armor (resistance 0) to original value (create_agility*2)
2667 SetResistanceBuffMods(SpellSchools(0), true, 0.0f);
2668 SetResistanceBuffMods(SpellSchools(0), false, 0.0f);
2669 // set other resistance to original value (0)
2670 for (uint8 i = 1; i < MAX_SPELL_SCHOOL; ++i)
2671 {
2673 SetResistanceBuffMods(SpellSchools(i), true, 0.0f);
2674 SetResistanceBuffMods(SpellSchools(i), false, 0.0f);
2675 }
2676
2679 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
2680 {
2683 }
2684 // Reset no reagent cost field
2685 for (uint8 i = 0; i < 3; ++i)
2687 // Init data for form but skip reapply item mods for form
2688 InitDataForForm(reapplyMods);
2689
2690 // save new stats
2691 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
2693
2694 SetMaxHealth(classInfo.basehealth); // stamina bonus will applied later
2695
2696 // cleanup mounted state (it will set correctly at aura loading if player saved at mount.
2698
2699 // cleanup unit flags (will be re-applied if need at aura load).
2707 SetImmuneToAll(false);
2709
2711
2712 // cleanup player flags (will be re-applied if need at aura load), to avoid have ghost flag without ghost aura, for example.
2714
2715 RemoveStandFlags(UNIT_STAND_FLAGS_ALL); // one form stealth modified bytes
2717 {
2719 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
2720
2721 }
2722 // restore if need some important flags
2723 SetUInt32Value(PLAYER_FIELD_BYTES2, 0); // flags empty by default
2724
2725 if (reapplyMods) // reapply stats values only on .reset stats (level) command
2727
2728 // set current level health and mana/energy to maximum after applying all mods.
2729 SetFullHealth();
2737
2738 // update level to hunter/summon pet
2739 if (Pet* pet = GetPet())
2740 pet->SynchronizeLevelWithOwner();
2741}
@ PLAYER_ALLOW_ONLY_ABILITY
Definition Player.h:491
@ PLAYER_FLAGS_DND
Definition Player.h:470
@ PLAYER_FLAGS_AFK
Definition Player.h:469
@ PLAYER_FLAGS_GM
Definition Player.h:471
@ UNIT_STAND_FLAGS_ALL
Definition UnitDefines.h:52
@ UNIT_BYTE2_FLAG_FFA_PVP
Definition UnitDefines.h:138
@ UNIT_BYTE2_FLAG_SANCTUARY
Definition UnitDefines.h:139
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:272
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:255
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:273
@ UNIT_FLAG_DISARMED
Definition UnitDefines.h:275
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:271
@ UNIT_FLAG_CONFUSED
Definition UnitDefines.h:276
@ UNIT_FLAG_FLEEING
Definition UnitDefines.h:277
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:279
@ UNIT_FLAG_LOOTING
Definition UnitDefines.h:264
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:261
@ UNIT_FLAG_SILENCED
Definition UnitDefines.h:267
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:281
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:265
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_POWER_COST_MODIFIER
Definition UpdateFields.h:170
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
@ PLAYER_SHIELD_BLOCK
Definition UpdateFields.h:355
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ PLAYER_FIELD_BYTES2
Definition UpdateFields.h:378
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
@ PLAYER_FIELD_MOD_DAMAGE_DONE_PCT
Definition UpdateFields.h:362
@ UNIT_FIELD_POWER_COST_MULTIPLIER
Definition UpdateFields.h:171
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
@ PLAYER_FIELD_MAX_LEVEL
Definition UpdateFields.h:384
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
@ PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE
Definition UpdateFields.h:367
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:919
void _ApplyAllStatBonuses()
Definition StatSystem.cpp:1008
void InitDataForForm(bool reapplyMods=false)
Definition Player.cpp:10591
void _RemoveAllStatBonuses()
Definition StatSystem.cpp:1020
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15675
void SetStat(Stats stat, int32 val)
Definition Unit.h:1037
void SetResistanceBuffMods(SpellSchools school, bool positive, float val)
Definition Unit.h:1165
float m_createStats[MAX_STATS]
Definition Unit.h:2105
void SetResistance(SpellSchools school, int32 val)
Definition Unit.h:1164
void RemoveStandFlags(uint8 flags)
Definition Unit.h:1742
void SetArmor(int32 val)
Definition Unit.h:1121
void SetMaxHealth(uint32 val)
Definition Unit.cpp:15557
void InitStatBuffMods()
Definition Unit.h:1047
void SetImmuneToAll(bool apply, bool keepCombat=false)
Definition Unit.h:907

References _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), PlayerClassLevelInfo::basehealth, PlayerClassLevelInfo::basemana, CONFIG_MAX_PLAYER_LEVEL, Unit::getClass(), Unit::GetCreatePowers(), Unit::GetLevel(), Unit::GetMaxPower(), GetPet(), Unit::GetPower(), Unit::getRace(), Object::HasByteFlag(), InitDataForForm(), Unit::InitStatBuffMods(), Unit::m_createStats, MAX_COMBAT_RATING, MAX_POWERS, MAX_SPELL_SCHOOL, MAX_STATS, PLAYER_ALLOW_ONLY_ABILITY, PLAYER_BLOCK_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_DODGE_PERCENTAGE, PLAYER_FIELD_BYTES2, PLAYER_FIELD_COMBAT_RATING_1, PLAYER_FIELD_MAX_LEVEL, PLAYER_FIELD_MOD_DAMAGE_DONE_NEG, PLAYER_FIELD_MOD_DAMAGE_DONE_PCT, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE, PLAYER_FIELD_MOD_TARGET_RESISTANCE, PLAYER_FLAGS_AFK, PLAYER_FLAGS_DND, PLAYER_FLAGS_GHOST, PLAYER_FLAGS_GM, PLAYER_NEXT_LEVEL_XP, PLAYER_NO_REAGENT_COST_1, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_PARRY_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SHIELD_BLOCK, PLAYER_SPELL_CRIT_PERCENTAGE1, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Object::RemoveByteFlag(), Object::RemoveFlag(), RemovePlayerFlag(), Unit::RemoveStandFlags(), Unit::SetArmor(), Unit::SetCreateHealth(), Unit::SetCreateMana(), Unit::SetCreateStat(), Object::SetFloatValue(), Unit::SetFullHealth(), Unit::SetImmuneToAll(), Object::SetInt32Value(), Unit::SetMaxHealth(), Unit::SetMaxPower(), SetObjectScale(), Unit::SetPower(), Unit::SetResistance(), Unit::SetResistanceBuffMods(), Unit::SetStat(), Unit::SetUInt32Value(), Unit::SetUnitFlag(), Unit::SetUnitFlag2(), sObjectMgr, sScriptMgr, STAT_AGILITY, STAT_STRENGTH, PlayerLevelInfo::stats, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_FLAGS, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, UNIT_FIELD_MOUNTDISPLAYID, UNIT_FIELD_POWER_COST_MODIFIER, UNIT_FIELD_POWER_COST_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FLAG2_REGENERATE_POWER, UNIT_FLAG_CONFUSED, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_DISARMED, UNIT_FLAG_FLEEING, UNIT_FLAG_IN_COMBAT, UNIT_FLAG_LOOTING, UNIT_FLAG_MOUNT, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PACIFIED, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_SILENCED, UNIT_FLAG_SKINNABLE, UNIT_FLAG_STUNNED, UNIT_FLAG_TAXI_FLIGHT, UNIT_MOD_CAST_SPEED, UNIT_STAND_FLAGS_ALL, and UpdateSkillsForLevel().

Referenced by Create(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), and LoadFromDB().

◆ InitTalentForLevel()

void Player::InitTalentForLevel ( )
2561{
2562 uint32 talentPointsForLevel = CalculateTalentsPoints();
2563
2564 // xinef: more talent points that we have are used, reset
2565 if (m_usedTalentCount > talentPointsForLevel)
2566 resetTalents(true);
2567 // xinef: else, recalculate free talent points count
2568 else
2569 SetFreeTalentPoints(talentPointsForLevel - m_usedTalentCount);
2570
2571 if (!GetSession()->PlayerLoading())
2572 SendTalentsInfoData(false); // update at client
2573}
void SendTalentsInfoData(bool pet)
Definition Player.cpp:14540
bool resetTalents(bool noResetCost=false)
Definition Player.cpp:3716
void SetFreeTalentPoints(uint32 points)
Definition Player.cpp:3811
uint32 CalculateTalentsPoints() const
Definition Player.cpp:13666

References CalculateTalentsPoints(), GetSession(), m_usedTalentCount, resetTalents(), SendTalentsInfoData(), and SetFreeTalentPoints().

Referenced by ActivateSpec(), Create(), GiveLevel(), character_commandscript::HandleCharacterLevel(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsCommand(), LoadFromDB(), and RewardQuest().

◆ InitTaxiNodesForLevel()

void Player::InitTaxiNodesForLevel ( )
inline

◆ inRandomLfgDungeon()

bool Player::inRandomLfgDungeon ( )
13121{
13122 if (sLFGMgr->selectedRandomLfgDungeon(GetGUID()))
13123 {
13124 Map const* map = GetMap();
13125 return sLFGMgr->inLfgDungeonMap(GetGUID(), map->GetId(), map->GetDifficulty());
13126 }
13127
13128 return false;
13129}

References Map::GetDifficulty(), Object::GetGUID(), Map::GetId(), WorldObject::GetMap(), and sLFGMgr.

◆ isAcceptWhispers()

bool Player::isAcceptWhispers ( ) const
inline

◆ IsActionButtonDataValid()

bool Player::IsActionButtonDataValid ( uint8  button,
uint32  action,
uint8  type 
)
5599{
5600 if (button >= MAX_ACTION_BUTTONS)
5601 {
5602 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: button must be < {}", action, button, GetName(), MAX_ACTION_BUTTONS);
5603 return false;
5604 }
5605
5606 if (action >= MAX_ACTION_BUTTON_ACTION_VALUE)
5607 {
5608 LOG_ERROR("entities.player", "Action {} not added into button {} for player {}: action must be < {}", action, button, GetName(), MAX_ACTION_BUTTON_ACTION_VALUE);
5609 return false;
5610 }
5611
5612 switch (type)
5613 {
5615 if (!sSpellMgr->GetSpellInfo(action))
5616 {
5617 LOG_ERROR("entities.player", "Spell action {} not added into button {} for player {}: spell not exist", action, button, GetName());
5618 return false;
5619 }
5620
5621 if (!HasSpell(action))
5622 {
5623 LOG_DEBUG("entities.player.loading", "Player::IsActionButtonDataValid Spell action {} not added into button {} for player {}: player don't known this spell", action, button, GetName());
5624 return false;
5625 }
5626 break;
5627 case ACTION_BUTTON_ITEM:
5628 if (!sObjectMgr->GetItemTemplate(action))
5629 {
5630 LOG_ERROR("entities.player", "Item action {} not added into button {} for player {}: item not exist", action, button, GetName());
5631 return false;
5632 }
5633 break;
5634 default:
5635 break; // other cases not checked at this moment
5636 }
5637
5638 return true;
5639}
@ ACTION_BUTTON_ITEM
Definition Player.h:236
@ ACTION_BUTTON_SPELL
Definition Player.h:231
#define MAX_ACTION_BUTTONS
Definition Player.h:270
#define MAX_ACTION_BUTTON_ACTION_VALUE
Definition Player.h:246

References ACTION_BUTTON_ITEM, ACTION_BUTTON_SPELL, WorldObject::GetName(), HasSpell(), LOG_DEBUG, LOG_ERROR, MAX_ACTION_BUTTON_ACTION_VALUE, MAX_ACTION_BUTTONS, sObjectMgr, and sSpellMgr.

Referenced by addActionButton().

◆ IsActiveQuest()

bool Player::IsActiveQuest ( uint32  quest_id) const
203{
204 return m_QuestStatus.find(quest_id) != m_QuestStatus.end();
205}

References m_QuestStatus.

◆ IsAffectedBySpellmod()

bool Player::IsAffectedBySpellmod ( SpellInfo const *  spellInfo,
SpellModifier mod,
Spell spell = nullptr 
)
9797{
9798 if (!mod || !spellInfo)
9799 return false;
9800
9801 // Mod out of charges
9802 if (spell && mod->charges == -1 && spell->m_appliedMods.find(mod->ownerAura) == spell->m_appliedMods.end())
9803 return false;
9804
9805 // +duration to infinite duration spells making them limited
9806 if (mod->op == SPELLMOD_DURATION && spellInfo->GetDuration() == -1)
9807 return false;
9808
9809 return spellInfo->IsAffectedBySpellMod(mod);
9810}

References SpellModifier::charges, SpellInfo::GetDuration(), SpellInfo::IsAffectedBySpellMod(), Spell::m_appliedMods, SpellModifier::op, SpellModifier::ownerAura, and SPELLMOD_DURATION.

Referenced by ApplySpellMod().

◆ isAFK()

◆ isAllowedToLoot()

bool Player::isAllowedToLoot ( Creature const *  creature)
5627{
5628 if (!creature->isDead() || !creature->IsDamageEnoughForLootingAndReward() || creature->IsLootRewardDisabled())
5629 return false;
5630
5631 if (HasPendingBind())
5632 return false;
5633
5634 const Loot* loot = &creature->loot;
5635 if (loot->isLooted()) // nothing to loot or everything looted.
5636 return false;
5637
5638 if (!loot->hasItemForAll() && !loot->hasItemFor(this)) // no loot in creature for this player
5639 return false;
5640
5641 if (loot->loot_type == LOOT_SKINNING)
5642 return creature->GetLootRecipientGUID() == GetGUID();
5643
5644 Group* thisGroup = GetGroup();
5645 if (!thisGroup)
5646 return this == creature->GetLootRecipient();
5647 else if (thisGroup != creature->GetLootRecipientGroup())
5648 return false;
5649
5650 switch (thisGroup->GetLootMethod())
5651 {
5652 case MASTER_LOOT:
5653 case FREE_FOR_ALL:
5654 return true;
5655 case ROUND_ROBIN:
5656 // may only loot if the player is the loot roundrobin player
5657 // or if there are free/quest/conditional item for the player
5658 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5659 return true;
5660
5661 return loot->hasItemFor(this);
5662 case GROUP_LOOT:
5663 case NEED_BEFORE_GREED:
5664 // may only loot if the player is the loot roundrobin player
5665 // or item over threshold (so roll(s) can be launched)
5666 // or if there are free/quest/conditional item for the player
5667 if (!loot->roundRobinPlayer || loot->roundRobinPlayer == GetGUID())
5668 return true;
5669
5670 if (loot->hasOverThresholdItem())
5671 return true;
5672
5673 return loot->hasItemFor(this);
5674 }
5675
5676 return false;
5677}
@ NEED_BEFORE_GREED
Definition LootMgr.h:62
@ GROUP_LOOT
Definition LootMgr.h:61
@ MASTER_LOOT
Definition LootMgr.h:60
@ ROUND_ROBIN
Definition LootMgr.h:59
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ LOOT_SKINNING
Definition LootMgr.h:85
LootMethod GetLootMethod() const
Definition Group.cpp:2326
bool HasPendingBind() const
Definition Player.h:2443
bool hasItemFor(Player *player) const
Definition LootMgr.cpp:937
bool isLooted() const
Definition LootMgr.h:368
bool hasOverThresholdItem() const
Definition LootMgr.cpp:982
ObjectGuid roundRobinPlayer
Definition LootMgr.h:324
bool hasItemForAll() const
Definition LootMgr.cpp:922
LootType loot_type
Definition LootMgr.h:326

References FREE_FOR_ALL, GetGroup(), Object::GetGUID(), Group::GetLootMethod(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GROUP_LOOT, Loot::hasItemFor(), Loot::hasItemForAll(), Loot::hasOverThresholdItem(), HasPendingBind(), Creature::IsDamageEnoughForLootingAndReward(), Unit::isDead(), Loot::isLooted(), Creature::IsLootRewardDisabled(), Creature::loot, LOOT_SKINNING, Loot::loot_type, MASTER_LOOT, NEED_BEFORE_GREED, ROUND_ROBIN, and Loot::roundRobinPlayer.

Referenced by Unit::PatchValuesUpdate().

◆ IsAlwaysDetectableFor()

bool Player::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

11476{
11478 return true;
11479
11480 if (duel && duel->State != DUEL_STATE_CHALLENGED && duel->Opponent == seer)
11481 {
11482 return false;
11483 }
11484
11485 if (Player const* seerPlayer = seer->ToPlayer())
11486 {
11487 if (IsGroupVisibleFor(seerPlayer))
11488 {
11489 return true;
11490 }
11491 }
11492
11493 return false;
11494}
@ DUEL_STATE_CHALLENGED
Definition Player.h:366
bool IsGroupVisibleFor(Player const *p) const
Definition Player.cpp:2294
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition Unit.cpp:14302

References duel, DUEL_STATE_CHALLENGED, Unit::IsAlwaysDetectableFor(), IsGroupVisibleFor(), and Object::ToPlayer().

◆ IsAtGroupRewardDistance()

bool Player::IsAtGroupRewardDistance ( WorldObject const *  pRewardSource) const
12810{
12811 WorldObject const* player = GetCorpse();
12812 if (!player || IsAlive())
12813 {
12814 player = this;
12815 }
12816
12817 if (!pRewardSource || !player->IsInMap(pRewardSource))
12818 {
12819 return false;
12820 }
12821
12822 if (pRewardSource->GetMap()->IsDungeon())
12823 {
12824 return true;
12825 }
12826
12827 return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE);
12828}
@ CONFIG_GROUP_XP_DISTANCE
Definition WorldConfig.h:147
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1278

References CONFIG_GROUP_XP_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetMap(), Unit::IsAlive(), Map::IsDungeon(), WorldObject::IsInMap(), and sWorld.

Referenced by KillRewarder::_InitGroupData(), KillRewarder::_RewardGroup(), SmartAI::EndPath(), GroupEventHappens(), OutdoorPvP::HandleKill(), OutdoorPvPNA::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleQuestConfirmAccept(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), spell_q12805_lifeblood_dummy::HandleScript(), IsAtLootRewardDistance(), Group::NeedBeforeGreed(), RewardPlayerAndGroupAtEvent(), and npc_custodian_of_time::npc_custodian_of_timeAI::WaypointReached().

◆ IsAtLootRewardDistance()

bool Player::IsAtLootRewardDistance ( WorldObject const *  pRewardSource) const
12831{
12832 if (!IsAtGroupRewardDistance(pRewardSource))
12833 {
12834 return false;
12835 }
12836
12837 if (HasPendingBind())
12838 {
12839 return false;
12840 }
12841
12842 return pRewardSource->HasAllowedLooter(GetGUID());
12843}

References Object::GetGUID(), WorldObject::HasAllowedLooter(), HasPendingBind(), and IsAtGroupRewardDistance().

Referenced by Loot::FillLoot(), Group::GroupLoot(), WorldSession::HandleLootMoneyOpcode(), Group::MasterLoot(), and Group::UpdateLooterGuid().

◆ IsAtRecruitAFriendDistance()

bool Player::IsAtRecruitAFriendDistance ( WorldObject const *  pOther) const
12846{
12847 if (!pOther)
12848 return false;
12849 WorldObject const* player = GetCorpse();
12850 if (!player || IsAlive())
12851 player = this;
12852
12853 if (player->GetMapId() != pOther->GetMapId() || player->GetInstanceId() != pOther->GetInstanceId())
12854 return false;
12855
12856 return pOther->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE);
12857}
@ CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE
Definition WorldConfig.h:148

References CONFIG_MAX_RECRUIT_A_FRIEND_DISTANCE, GetCorpse(), WorldObject::GetDistance(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::IsAlive(), and sWorld.

Referenced by GetsRecruitAFriendBonus().

◆ IsBagPos()

bool Player::IsBagPos ( uint16  pos)
static

◆ IsBankPos() [1/2]

◆ IsBankPos() [2/2]

bool Player::IsBankPos ( uint8  bag,
uint8  slot 
)
static
581{
582 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END))
583 return true;
584 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
585 return true;
586 if (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
587 return true;
588 return false;
589}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, and INVENTORY_SLOT_BAG_0.

◆ IsBaseRuneSlotsOnCooldown()

bool Player::IsBaseRuneSlotsOnCooldown ( RuneType  runeType) const
13528{
13529 for (uint8 i = 0; i < MAX_RUNES; ++i)
13530 if (GetBaseRune(i) == runeType && GetRuneCooldown(i) == 0)
13531 return false;
13532
13533 return true;
13534}
uint32 GetRuneCooldown(uint8 index) const
Definition Player.h:2512

References GetBaseRune(), GetRuneCooldown(), and MAX_RUNES.

Referenced by Unit::HandleProcTriggerSpell().

◆ isBeingLoaded()

bool Player::isBeingLoaded ( ) const
overridevirtual

◆ IsBeingTeleported()

◆ IsBeingTeleportedFar()

bool Player::IsBeingTeleportedFar ( ) const
inline

◆ IsBeingTeleportedNear()

bool Player::IsBeingTeleportedNear ( ) const
inline

◆ IsClass()

bool Player::IsClass ( Classes  playerClass,
ClassContext  context = CLASS_CONTEXT_NONE 
) const
overridevirtual

Reimplemented from Unit.

1300{
1301 Optional<bool> scriptResult = sScriptMgr->OnPlayerIsClass(this, unitClass, context);
1302 if (scriptResult != std::nullopt)
1303 return *scriptResult;
1304 else
1305 return (getClass() == unitClass);
1306}

References Unit::getClass(), and sScriptMgr.

Referenced by _ApplyItemBonuses(), ActivateSpec(), ActivateTaxiPathTo(), ApplyEnchantment(), CalculateTalentsPoints(), CanEquipItem(), Group::CanJoinBattlegroundQueue(), CanResummonPet(), CanRollForItemInLFG(), CanUseItem(), Spell::CheckRuneCost(), Create(), WorldSession::DoLootRelease(), DuelComplete(), Spell::EffectActivateRune(), Spell::EffectSummonPet(), EquipItem(), spell_class_call_handler::FilterTargets(), FindEquipSlot(), Graveyard::GetClosestGraveyard(), GetNPCIfCanInteractWith(), spell_gen_on_tournament_mount::GetPennatSpellId(), GetStartPosition(), AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattlemasterJoinOpcode(), spell_item_refocus::HandleDummy(), WorldSession::HandleLootMoneyOpcode(), AuraEffect::HandlePeriodicDummyAuraTick(), Unit::HandleProcTriggerSpell(), reset_commandscript::HandleResetLevelCommand(), spell_gen_pet_summoned::HandleScript(), ArenaSpectator::HandleSpectatorSpectateCommand(), lfg::LFGMgr::InitializeLockedDungeons(), InitRunes(), Creature::isCanTrainingAndResetTalentsOf(), Pet::IsPermanentPetFor(), Creature::IsValidTrainerForPlayer(), LearnDefaultSkill(), Pet::LoadPetFromDB(), npc_bunthen_plainswind::OnGossipHello(), npc_silva_filnaveth::OnGossipHello(), npc_bunthen_plainswind::OnGossipSelect(), npc_silva_filnaveth::OnGossipSelect(), PrepareGossipMenu(), RegenerateAll(), TeleportTo(), UpdateAttackPowerAndDamage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ IsCommentator()

bool Player::IsCommentator ( ) const
inline
@ PLAYER_FLAGS_COMMENTATOR2
Definition Player.h:490

References HasPlayerFlag(), and PLAYER_FLAGS_COMMENTATOR2.

Referenced by GetChatTag(), and misc_commandscript::HandleCommentatorCommand().

◆ IsCurrentBattlegroundRandom()

bool Player::IsCurrentBattlegroundRandom ( ) const
inline
2262{ return m_bgData.bgIsRandom; }
bool bgIsRandom
Definition Player.h:1035

References BGData::bgIsRandom, and m_bgData.

◆ IsDailyQuestDone()

bool Player::IsDailyQuestDone ( uint32  quest_id)
12167{
12168 if (sObjectMgr->GetQuestTemplate(quest_id))
12169 {
12170 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12171 {
12172 if (GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx) == quest_id)
12173 {
12174 return true;
12175 }
12176 }
12177 }
12178
12179 return false;
12180}

References Object::GetUInt32Value(), PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and sObjectMgr.

◆ IsDeserter()

bool Player::IsDeserter ( ) const
inline
2268{ return HasAura(26013); }

References Unit::HasAura().

◆ IsDeveloper()

bool Player::IsDeveloper ( ) const
inline

◆ isDND()

◆ IsEquipmentPos() [1/2]

◆ IsEquipmentPos() [2/2]

bool Player::IsEquipmentPos ( uint8  bag,
uint8  slot 
)
static
572{
573 if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
574 return true;
576 return true;
577 return false;
578}

References EQUIPMENT_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, and INVENTORY_SLOT_BAG_START.

◆ IsExistPet()

bool Player::IsExistPet ( )

◆ IsExpectingChangeTransport()

bool Player::IsExpectingChangeTransport ( ) const
inline

◆ IsFalling()

bool Player::IsFalling ( ) const
2156{
2157 // Xinef: Added !IsInFlight check
2158 return GetPositionZ() < m_lastFallZ && !IsInFlight();
2159}

References Position::GetPositionZ(), Unit::IsInFlight(), and m_lastFallZ.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsFFAPvP()

bool Player::IsFFAPvP ( )
16236{
16237 bool result = Unit::IsFFAPvP();
16238
16239 sScriptMgr->OnPlayerIsFFAPvP(this, result);
16240
16241 return result;
16242}
bool IsFFAPvP() const
Definition Unit.h:1023

References Unit::IsFFAPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), WorldSession::HandleRequestPartyMemberStatsOpcode(), RewardHonor(), UpdateFFAPvPFlag(), and UpdateFFAPvPState().

◆ IsFreeFlying()

bool Player::IsFreeFlying ( ) const
inline

◆ IsGameMaster()

bool Player::IsGameMaster ( ) const
inline
1161{ return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
@ PLAYER_EXTRA_GM_ON
Definition Player.h:579

References m_ExtraFlags, and PLAYER_EXTRA_GM_ON.

Referenced by ThreatMgr::_addThreat(), Group::_homebindIfInstance(), Unit::_IsValidAssistTarget(), Unit::_IsValidAttackTarget(), Unit::Attack(), GameObject::BuildValuesUpdate(), BuyItemFromVendorSlot(), npc_coren_direbrew::CanBeSeen(), go_loosely_turned_soil::go_loosely_turned_soilAI::CanBeSeen(), Group::CanJoinBattlegroundQueue(), InstanceMap::CannotEnter(), CanTameExoticPets(), Spell::CheckCast(), CheckInstanceLoginValid(), SpellInfo::CheckTarget(), AchievementMgr::CompletedAchievement(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), spell_class_call_polymorph::FilterTargets(), GetPhaseMaskForSpawn(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattlemasterJoinOpcode(), HandleFall(), WorldSession::HandleGroupInviteOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInspectOpcode(), WorldSession::HandleMessagechatOpcode(), mmaps_commandscript::HandleMmapPathCommand(), misc_commandscript::HandlePInfoCommand(), Battlefield::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), tele_commandscript::HandleTeleCommand(), lfg::LFGMgr::InitializeLockedDungeons(), IsValidCombatTarget(), ThreatCalcHelper::isValidProcess(), boss_felblood_kaelthas::LapseAction(), WorldSession::LogoutPlayer(), MailSender::MailSender(), boss_nalorakk::MoveInLineOfSight(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_ouro_spawner::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_barnes::OnGossipHello(), go_ulduar_pure_saronite_deposit::OnGossipHello(), at_trigger_the_beast_movement::OnTrigger(), at_the_beast_room::OnTrigger(), at_ancient_leaf::OnTrigger(), at_lady_deathwhisper_entrance::OnTrigger(), at_icc_gauntlet_event::OnTrigger(), at_icc_putricide_trap::OnTrigger(), at_hor_shadow_throne::OnTrigger(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Unit::PatchValuesUpdate(), MapMgr::PlayerCannotEnter(), Unit::ProcessTerrainStatusUpdate(), Battleground::RemovePlayerAtLeave(), boss_kologarn_pit_kill_bunny::Reset(), AchievementMgr::ResetAchievementCriteria(), Satisfy(), npc_minigob_manabonk::SelectTargetInDalaran(), WorldSession::SendListInventory(), Spell::SendLoot(), SetIsSpectator(), Unit::TauntApply(), Unit::TauntFadeOut(), TeleportTo(), ToggleAFK(), AchievementMgr::UpdateAchievementCriteria(), boss_nefarian::UpdateAI(), UpdateFFAPvPState(), UpdateHomebindTime(), and Whisper().

◆ isGMChat()

bool Player::isGMChat ( ) const
inline
@ PLAYER_EXTRA_GM_CHAT
Definition Player.h:583

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by GetChatTag().

◆ IsGMSpectator()

bool Player::IsGMSpectator ( ) const
inline
@ PLAYER_EXTRA_GM_SPECTATOR
Definition Player.h:588

References m_ExtraFlags, and PLAYER_EXTRA_GM_SPECTATOR.

Referenced by gm_commandscript::HandleGMSpectatorCommand(), and Unit::PatchValuesUpdate().

◆ isGMVisible()

bool Player::isGMVisible ( ) const
inline
@ PLAYER_EXTRA_GM_INVISIBLE
Definition Player.h:582

References m_ExtraFlags, and PLAYER_EXTRA_GM_INVISIBLE.

Referenced by gm_commandscript::HandleGMVisibleCommand(), and Channel::Invite().

◆ IsGroupVisibleFor()

bool Player::IsGroupVisibleFor ( Player const *  p) const
2295{
2296 switch (sWorld->getIntConfig(CONFIG_GROUP_VISIBILITY))
2297 {
2298 default:
2299 return IsInSameGroupWith(p);
2300 case 1:
2301 return IsInSameRaidWith(p);
2302 case 2:
2303 return GetTeamId() == p->GetTeamId();
2304 }
2305}
@ CONFIG_GROUP_VISIBILITY
Definition WorldConfig.h:214
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1881
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2307

References CONFIG_GROUP_VISIBILITY, GetTeamId(), IsInSameGroupWith(), IsInSameRaidWith(), and sWorld.

Referenced by IsAlwaysDetectableFor().

◆ isHonorOrXPTarget()

bool Player::isHonorOrXPTarget ( Unit victim) const
12720{
12721 uint8 v_level = victim->GetLevel();
12723
12724 // Victim level less gray level
12725 if (v_level <= k_grey)
12726 return false;
12727
12728 if (victim->IsCreature())
12729 if (victim->IsTotem() || victim->IsCritter() || victim->IsPet() || victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_XP))
12730 return false;
12731
12732 return true;
12733}
@ CREATURE_FLAG_EXTRA_NO_XP
Definition CreatureData.h:51
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:77
bool IsCritter() const
Definition Unit.h:816
bool IsTotem() const
Definition Unit.h:782

References CREATURE_FLAG_EXTRA_NO_XP, Acore::XP::GetGrayLevel(), Unit::GetLevel(), Creature::HasFlagsExtra(), Object::IsCreature(), Unit::IsCritter(), Unit::IsPet(), Unit::IsTotem(), and Object::ToCreature().

Referenced by spell_warl_drain_soul::HandleTick(), Unit::IsTriggeredAtSpellProcEvent(), achievement_killed_exp_or_honor_target::OnCheck(), RaiseDeadCheck::operator()(), spell_warl_drain_soul::RemoveEffect(), and spell_warl_shadowburn::RemoveEffect().

◆ IsImmuneToEnvironmentalDamage()

bool Player::IsImmuneToEnvironmentalDamage ( )
763{
764 // check for GM and death state included in isAttackableByAOE
765 return (!isTargetableForAttack(false, nullptr)) || isTotalImmune();
766}
bool isTargetableForAttack(bool checkFakeDeath=true, Unit const *byWho=nullptr) const
Definition Unit.cpp:13942

References Unit::isTargetableForAttack(), and isTotalImmune().

Referenced by EnvironmentalDamage().

◆ IsInAreaTriggerRadius()

bool Player::IsInAreaTriggerRadius ( AreaTrigger const *  trigger,
float  delta = 0.f 
) const
2183{
2184 if (!trigger || GetMapId() != trigger->map)
2185 return false;
2186
2187 if (trigger->radius > 0)
2188 {
2189 // if we have radius check it
2190 float dist = GetDistance(trigger->x, trigger->y, trigger->z);
2191 if (dist > trigger->radius + delta)
2192 return false;
2193 }
2194 else
2195 {
2196 Position center(trigger->x, trigger->y, trigger->z, trigger->orientation);
2197 if (!IsWithinBox(center, trigger->length / 2 + delta, trigger->width / 2 + delta, trigger->height / 2 + delta))
2198 return false;
2199 }
2200
2201 return true;
2202}
Definition Position.h:27
bool IsWithinBox(const Position &center, float xradius, float yradius, float zradius) const
Definition Position.cpp:118

References WorldObject::GetDistance(), WorldLocation::GetMapId(), AreaTrigger::height, Position::IsWithinBox(), AreaTrigger::length, AreaTrigger::map, AreaTrigger::orientation, AreaTrigger::radius, AreaTrigger::width, AreaTrigger::x, AreaTrigger::y, and AreaTrigger::z.

Referenced by WorldSession::HandleAreaTriggerOpcode(), and Update().

◆ IsInSameGroupWith()

bool Player::IsInSameGroupWith ( Player const *  p) const
2308{
2309 return p == this || (GetGroup() &&
2310 GetGroup() == p->GetGroup() &&
2311 GetGroup()->SameSubGroup(this, p));
2312}
bool SameSubGroup(ObjectGuid guid1, ObjectGuid guid2) const
Definition Group.cpp:2373

References GetGroup(), and Group::SameSubGroup().

Referenced by IsGroupVisibleFor(), and Unit::IsInPartyWith().

◆ IsInSameRaidWith()

◆ IsInventoryPos() [1/2]

◆ IsInventoryPos() [2/2]

bool Player::IsInventoryPos ( uint8  bag,
uint8  slot 
)
static
559{
560 if (bag == INVENTORY_SLOT_BAG_0 && slot == NULL_SLOT)
561 return true;
563 return true;
565 return true;
566 if (bag == INVENTORY_SLOT_BAG_0 && (slot >= KEYRING_SLOT_START && slot < CURRENCYTOKEN_SLOT_END))
567 return true;
568 return false;
569}

References CURRENCYTOKEN_SLOT_END, INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_START, and NULL_SLOT.

◆ IsInvitedForBattlegroundInstance() [1/2]

bool Player::IsInvitedForBattlegroundInstance ( ) const
inline
2261{ return m_bgData.isInvited; }
bool isInvited
Definition Player.h:1034

References BGData::isInvited, and m_bgData.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::LogoutPlayer().

◆ IsInvitedForBattlegroundInstance() [2/2]

bool Player::IsInvitedForBattlegroundInstance ( uint32  instanceId) const
12339{
12340 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12341 if (_BgBattlegroundQueueID[i].invitedToInstance == instanceId)
12342 return true;
12343
12344 return false;
12345}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

◆ IsInvitedForBattlegroundQueueType()

bool Player::IsInvitedForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId) const
12281{
12282 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12283 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12284 return _BgBattlegroundQueueID[i].invitedToInstance != 0;
12285
12286 return false;
12287}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by WorldSession::HandleBattleFieldPortOpcode().

◆ IsInWater()

bool Player::IsInWater ( ) const
inlineoverridevirtual

Reimplemented from Unit.

1121{ return m_isInWater; }

References m_isInWater.

Referenced by WorldSession::ProcessMovementInfo().

◆ IsInWhisperWhiteList()

bool Player::IsInWhisperWhiteList ( ObjectGuid  guid)
16008{
16009 for (auto const& itr : WhisperList)
16010 {
16011 if (itr == guid)
16012 {
16013 return true;
16014 }
16015 }
16016
16017 return false;
16018}

References WhisperList.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ IsMaxLevel()

bool Player::IsMaxLevel ( ) const

◆ IsMirrorTimerActive()

bool Player::IsMirrorTimerActive ( MirrorTimerType  type)
inline
2060{ return m_MirrorTimer[type] == getMaxTimer(type); }

References getMaxTimer(), and m_MirrorTimer.

Referenced by lfg::LFGMgr::TeleportPlayer().

◆ IsNeedCastPassiveSpellAtLearn()

bool Player::IsNeedCastPassiveSpellAtLearn ( SpellInfo const *  spellInfo) const
3295{
3296 // note: form passives activated with shapeshift spells be implemented by HandleShapeshiftBoosts instead of spell_learn_spell
3297 // talent dependent passives activated at form apply have proper stance data
3299 return (!spellInfo->Stances || (form && (spellInfo->Stances & (1 << (form - 1)))) ||
3300 (!form && spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)));
3301}
@ SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED
Definition SharedDefines.h:486

References Unit::GetShapeshiftForm(), SpellInfo::HasAttribute(), SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, and SpellInfo::Stances.

Referenced by _addSpell(), and _addTalentAurasAndSpells().

◆ IsNeverVisible()

bool Player::IsNeverVisible ( ) const
overridevirtual

Reimplemented from WorldObject.

11452{
11454 return true;
11455
11456 if (GetSession()->PlayerLogout() || GetSession()->PlayerLoading())
11457 return true;
11458
11459 return false;
11460}
virtual bool IsNeverVisible() const
Definition Object.h:756

References GetSession(), and WorldObject::IsNeverVisible().

◆ IsOutdoorPvPActive()

bool Player::IsOutdoorPvPActive ( )

◆ IsPetNeedBeTemporaryUnsummoned()

bool Player::IsPetNeedBeTemporaryUnsummoned ( ) const
inline
2421{ return GetSession()->PlayerLogout() || !IsInWorld() || !IsAlive() || IsMounted()/*+in flight*/ || GetVehicle() || IsBeingTeleported(); }
Vehicle * GetVehicle() const
Definition Unit.h:1880
bool PlayerLogout() const
Definition WorldSession.h:382

References GetSession(), Unit::GetVehicle(), Unit::IsAlive(), IsBeingTeleported(), Object::IsInWorld(), Unit::IsMounted(), and WorldSession::PlayerLogout().

Referenced by Pet::LoadPetFromDB(), and ResummonPetTemporaryUnSummonedIfAny().

◆ IsPvP()

bool Player::IsPvP ( )
16245{
16246 bool result = Unit::IsPvP();
16247
16248 sScriptMgr->OnPlayerIsPvP(this, result);
16249
16250 return result;
16251}
bool IsPvP() const
Definition Unit.h:1022

References Unit::IsPvP(), and sScriptMgr.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), DuelComplete(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleRequestPartyMemberStatsOpcode(), IsOutdoorPvPActive(), UpdatePvPFlag(), and UpdatePvPState().

◆ IsQuestRewarded()

bool Player::IsQuestRewarded ( uint32  quest_id) const
inline

◆ isResurrectRequested()

bool Player::isResurrectRequested ( ) const
inline

◆ isResurrectRequestedBy()

bool Player::isResurrectRequestedBy ( ObjectGuid  guid) const
inline
1822{ return m_resurrectGUID && m_resurrectGUID == guid; }

References m_resurrectGUID.

◆ IsSpectator()

◆ IsSpellFitByClassAndRace()

bool Player::IsSpellFitByClassAndRace ( uint32  spell_id) const
12408{
12409 uint32 racemask = getRaceMask();
12410 uint32 classmask = getClassMask();
12411
12412 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
12413 if (bounds.first == bounds.second)
12414 return true;
12415
12416 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
12417 {
12418 // skip wrong race skills
12419 if (_spell_idx->second->RaceMask && (_spell_idx->second->RaceMask & racemask) == 0)
12420 continue;
12421
12422 // skip wrong class skills
12423 if (_spell_idx->second->ClassMask && (_spell_idx->second->ClassMask & classmask) == 0)
12424 continue;
12425
12426 return true;
12427 }
12428
12429 return false;
12430}

References Unit::getClassMask(), Unit::getRaceMask(), and sSpellMgr.

Referenced by GetTrainerSpellState(), learn_commandscript::HandleLearnAllMySpellsCommand(), and WorldSession::SendTrainerList().

◆ IsSummonAsSpectator()

bool Player::IsSummonAsSpectator ( ) const

◆ isTaxiCheater()

bool Player::isTaxiCheater ( ) const
inline

◆ isTotalImmune()

bool Player::isTotalImmune ( ) const
13359{
13361
13362 uint32 immuneMask = 0;
13363 for (AuraEffectList::const_iterator itr = immune.begin(); itr != immune.end(); ++itr)
13364 {
13365 immuneMask |= (*itr)->GetMiscValue();
13366 if (immuneMask & SPELL_SCHOOL_MASK_ALL) // total immunity
13367 return true;
13368 }
13369 return false;
13370}
@ SPELL_SCHOOL_MASK_ALL
Definition SharedDefines.h:326
@ SPELL_AURA_SCHOOL_IMMUNITY
Definition SpellAuraDefines.h:102

References Unit::GetAuraEffectsByType(), SPELL_AURA_SCHOOL_IMMUNITY, and SPELL_SCHOOL_MASK_ALL.

Referenced by CanUseBattlegroundObject(), and IsImmuneToEnvironmentalDamage().

◆ IsTotemCategoryCompatiableWith()

bool Player::IsTotemCategoryCompatiableWith ( ItemTemplate const *  pProto,
uint32  requiredTotemCategoryId 
) const
883{
884 if (requiredTotemCategoryId == 0)
885 return true;
886 if (pProto->TotemCategory == 0)
887 return false;
888
889 TotemCategoryEntry const* itemEntry = sTotemCategoryStore.LookupEntry(pProto->TotemCategory);
890 if (!itemEntry)
891 return false;
892 TotemCategoryEntry const* reqEntry = sTotemCategoryStore.LookupEntry(requiredTotemCategoryId);
893 if (!reqEntry)
894 return false;
895
896 if (itemEntry->categoryType != reqEntry->categoryType)
897 return false;
898
899 if ((itemEntry->categoryMask & reqEntry->categoryMask) != reqEntry->categoryMask)
900 return false;
901
902 // xinef: check skill requirements, needed for enchants!
903 if (pProto->RequiredSkill)
904 if (this->GetSkillValue(pProto->RequiredSkill) < pProto->RequiredSkillRank)
905 return false;
906
907 return true;
908}
DBCStorage< TotemCategoryEntry > sTotemCategoryStore(TotemCategoryEntryfmt)
Definition DBCStructure.h:1995
uint32 categoryType
Definition DBCStructure.h:1999
uint32 categoryMask
Definition DBCStructure.h:2000

References TotemCategoryEntry::categoryMask, TotemCategoryEntry::categoryType, GetSkillValue(), ItemTemplate::RequiredSkill, ItemTemplate::RequiredSkillRank, sTotemCategoryStore, and ItemTemplate::TotemCategory.

Referenced by HasItemTotemCategory().

◆ IsTwoHandUsed()

◆ IsUsingLfg()

bool Player::IsUsingLfg ( )

◆ IsValidGender()

static bool Player::IsValidGender ( uint8  Gender)
inlinestatic
1569{ return Gender <= GENDER_FEMALE; }
Gender
Definition SharedDefines.h:60

References GENDER_FEMALE.

Referenced by BuildEnumData(), Create(), ConditionMgr::isConditionTypeValid(), and LoadFromDB().

◆ IsValidPos() [1/2]

bool Player::IsValidPos ( uint16  pos,
bool  explicit_pos 
)
inline
1269{ return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
bool IsValidPos(uint16 pos, bool explicit_pos)
Definition Player.h:1269

References IsValidPos().

Referenced by WorldSession::HandleAutoStoreBagItemOpcode(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), and IsValidPos().

◆ IsValidPos() [2/2]

bool Player::IsValidPos ( uint8  bag,
uint8  slot,
bool  explicit_pos 
)
603{
604 // post selected
605 if (bag == NULL_BAG && !explicit_pos)
606 return true;
607
608 if (bag == INVENTORY_SLOT_BAG_0)
609 {
610 // any post selected
611 if (slot == NULL_SLOT && !explicit_pos)
612 return true;
613
614 // equipment
615 if (slot < EQUIPMENT_SLOT_END)
616 return true;
617
618 // bag equip slots
620 return true;
621
622 // backpack slots
624 return true;
625
626 // keyring slots
627 if (slot >= KEYRING_SLOT_START && slot < KEYRING_SLOT_END)
628 return true;
629
630 // bank main slots
631 if (slot >= BANK_SLOT_ITEM_START && slot < BANK_SLOT_ITEM_END)
632 return true;
633
634 // bank bag slots
635 if (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END)
636 return true;
637
638 return false;
639 }
640
641 // bag content slots
642 // bank bag content slots
643 if (Bag* pBag = GetBagByPos(bag))
644 {
645 // any post selected
646 if (slot == NULL_SLOT && !explicit_pos)
647 return true;
648
649 return slot < pBag->GetBagSize();
650 }
651
652 // where this?
653 return false;
654}

References BANK_SLOT_BAG_END, BANK_SLOT_BAG_START, BANK_SLOT_ITEM_END, BANK_SLOT_ITEM_START, EQUIPMENT_SLOT_END, GetBagByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, KEYRING_SLOT_END, KEYRING_SLOT_START, NULL_BAG, and NULL_SLOT.

◆ IsVisibleGloballyFor()

bool Player::IsVisibleGloballyFor ( Player const *  player) const
11497{
11498 if (!u)
11499 return false;
11500
11501 // Always can see self
11502 if (u == this)
11503 return true;
11504
11505 // Visible units, always are visible for all players
11506 if (IsVisible())
11507 return true;
11508
11509 // GMs are visible for higher gms (or players are visible for gms)
11510 if (!AccountMgr::IsPlayerAccount(u->GetSession()->GetSecurity()))
11511 return GetSession()->GetSecurity() <= u->GetSession()->GetSecurity();
11512
11513 if (!sScriptMgr->OnPlayerNotVisibleGloballyFor(const_cast<Player*>(this), u))
11514 return true;
11515
11516 // non faction visibility non-breakable for non-GMs
11517 return false;
11518}
bool IsVisible() const
Definition Unit.h:1967
AccountTypes GetSecurity() const
Definition WorldSession.h:421

References WorldSession::GetSecurity(), GetSession(), AccountMgr::IsPlayerAccount(), Unit::IsVisible(), and sScriptMgr.

Referenced by SocialMgr::BroadcastToFriendListers(), SocialMgr::GetFriendInfo(), WorldSession::HandleAddFriendOpcode(), and ChatHandler::needReportToTarget().

◆ IsWorldObjectOutOfSightRange()

bool Player::IsWorldObjectOutOfSightRange ( WorldObject const *  target) const
16310{
16311 // Special handling for Infinite visibility override objects -> they are zone wide visible
16312 if (target->GetVisibilityOverrideType() == VisibilityDistanceType::Infinite)
16313 {
16314 // Same zone, always visible
16315 if (target->GetZoneId() == GetZoneId())
16316 return false;
16317 }
16318
16319 // Check if out of range
16320 return !m_seer->IsWithinDist(target, GetSightRange(target), false);
16321}
float GetSightRange(WorldObject const *target=nullptr) const override
Definition Player.cpp:16300
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1349

References GetSightRange(), WorldObject::GetVisibilityOverrideType(), WorldObject::GetZoneId(), Infinite, WorldObject::IsWithinDist(), and m_seer.

Referenced by Acore::VisibleNotifier::SendToSelf().

◆ ItemAddedQuestCheck()

void Player::ItemAddedQuestCheck ( uint32  entry,
uint32  count 
)
1836{
1837 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1838 {
1839 uint32 questid = GetQuestSlotQuestId(i);
1840 if (questid == 0)
1841 continue;
1842
1843 QuestStatusData& q_status = m_QuestStatus[questid];
1844
1845 if (q_status.Status != QUEST_STATUS_INCOMPLETE)
1846 continue;
1847
1848 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1849 if (!qInfo || !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER))
1850 continue;
1851
1852 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1853 {
1854 uint32 reqitem = qInfo->RequiredItemId[j];
1855 if (reqitem == entry)
1856 {
1857 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1858 uint16 curitemcount = q_status.ItemCount[j];
1859 if (curitemcount < reqitemcount)
1860 {
1861 q_status.ItemCount[j] = std::min<uint16>(q_status.ItemCount[j] + count, reqitemcount);
1862 m_QuestStatusSave[questid] = true;
1863 }
1864 if (CanCompleteQuest(questid))
1865 CompleteQuest(questid);
1866 else
1868 }
1869 }
1870 }
1872}

References ADDITIONAL_SAVING_INVENTORY_AND_GOLD, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, QUEST_STATUS_INCOMPLETE, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, QuestStatusData::Status, and UpdateForQuestWorldObjects().

Referenced by Spell::EffectSummonChangeItem(), EquipNewItem(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), MoveItemToInventory(), StoreNewItem(), and SwapItem().

◆ ItemRemovedQuestCheck()

void Player::ItemRemovedQuestCheck ( uint32  entry,
uint32  count 
)
1875{
1876 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1877 {
1878 uint32 questid = GetQuestSlotQuestId(i);
1879 if (!questid)
1880 continue;
1881
1882 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1883 if (!qInfo)
1884 continue;
1885
1887 continue;
1888
1889 for (uint8 j = 0; j < QUEST_ITEM_OBJECTIVES_COUNT; ++j)
1890 {
1891 uint32 reqitem = qInfo->RequiredItemId[j];
1892 if (reqitem == entry)
1893 {
1894 QuestStatusData& q_status = m_QuestStatus[questid];
1895 uint32 reqitemcount = qInfo->RequiredItemCount[j];
1896 uint16 curitemcount = q_status.ItemCount[j];
1897
1898 if (q_status.ItemCount[j] >= reqitemcount) // we may have more than what the status shows
1899 curitemcount = GetItemCount(entry, false);
1900
1901 uint16 newItemCount = (count > curitemcount) ? 0 : curitemcount - count;
1902 newItemCount = std::min<uint16>(newItemCount, reqitemcount);
1903 if (newItemCount != q_status.ItemCount[j])
1904 {
1905 q_status.ItemCount[j] = newItemCount;
1906 m_QuestStatusSave[questid] = true;
1907 IncompleteQuest(questid);
1908 }
1909 }
1910 }
1911 }
1913}
void IncompleteQuest(uint32 quest_id)
Definition PlayerQuest.cpp:642

References GetItemCount(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), IncompleteQuest(), QuestStatusData::ItemCount, m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_DELIVER, Quest::RequiredItemCount, Quest::RequiredItemId, sObjectMgr, and UpdateForQuestWorldObjects().

Referenced by DestroyItem(), DestroyItemCount(), DestroyItemCount(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ JoinedChannel()

void Player::JoinedChannel ( Channel c)
5012{
5013 m_channels.push_back(c);
5014}

References m_channels.

Referenced by Channel::JoinChannel().

◆ KillCreditGO()

void Player::KillCreditGO ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
2057{
2058 uint16 addCastCount = 1;
2059 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2060 {
2061 uint32 questid = GetQuestSlotQuestId(i);
2062 if (!questid)
2063 continue;
2064
2065 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2066 if (!qInfo)
2067 continue;
2068
2069 QuestStatusData& q_status = m_QuestStatus[questid];
2070
2071 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2072 {
2073 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL)*/)
2074 {
2075 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2076 {
2077 uint32 reqTarget = 0;
2078
2079 // GO activate objective
2080 if (qInfo->RequiredNpcOrGo[j] < 0)
2081 // checked at quest_template loading
2082 reqTarget = - qInfo->RequiredNpcOrGo[j];
2083
2084 // other not this creature/GO related objectives
2085 if (reqTarget != entry)
2086 continue;
2087
2088 uint32 reqCastCount = qInfo->RequiredNpcOrGoCount[j];
2089 uint16 curCastCount = q_status.CreatureOrGOCount[j];
2090 if (curCastCount < reqCastCount)
2091 {
2092 q_status.CreatureOrGOCount[j] = curCastCount + addCastCount;
2093
2094 m_QuestStatusSave[questid] = true;
2095
2096 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curCastCount, addCastCount);
2097 }
2098
2099 if (CanCompleteQuest(questid))
2100 CompleteQuest(questid);
2101 else
2103
2104 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2105 break;
2106 }
2107 }
2108 }
2109 }
2110}
void SendQuestUpdateAddCreatureOrGo(Quest const *quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count)
Definition PlayerQuest.cpp:2456

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by GameObject::Use().

◆ KilledMonster()

void Player::KilledMonster ( CreatureTemplate const *  cInfo,
ObjectGuid  guid 
)
1916{
1917 ASSERT(cInfo);
1918
1919 if (cInfo->Entry)
1920 KilledMonsterCredit(cInfo->Entry, guid);
1921
1922 for (uint8 i = 0; i < MAX_KILL_CREDIT; ++i)
1923 if (cInfo->KillCredit[i])
1924 KilledMonsterCredit(cInfo->KillCredit[i]);
1925}
#define MAX_KILL_CREDIT
Definition CreatureData.h:30
void KilledMonsterCredit(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition PlayerQuest.cpp:1927

References ASSERT, CreatureTemplate::Entry, CreatureTemplate::KillCredit, KilledMonsterCredit(), and MAX_KILL_CREDIT.

Referenced by KillRewarder::_RewardKillCredit(), and npc_drakuru_shackles::npc_drakuru_shacklesAI::SpellHit().

◆ KilledMonsterCredit()

void Player::KilledMonsterCredit ( uint32  entry,
ObjectGuid  guid = ObjectGuid::Empty 
)
1928{
1929 uint16 addkillcount = 1;
1930 uint32 real_entry = entry;
1931 if (guid)
1932 {
1933 Creature* killed = GetMap()->GetCreature(guid);
1934 if (killed && killed->GetEntry())
1935 real_entry = killed->GetEntry();
1936 }
1937
1938 StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
1939 UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addkillcount, guid ? GetMap()->GetCreature(guid) : nullptr);
1940
1941 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1942 {
1943 uint32 questid = GetQuestSlotQuestId(i);
1944 if (!questid)
1945 continue;
1946
1947 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
1948 if (!qInfo)
1949 continue;
1950 // just if !ingroup || !noraidgroup || raidgroup
1951 // xinef: or is pvp quest, and player in BG/BF group
1952 QuestStatusData& q_status = m_QuestStatus[questid];
1953 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty()) ||
1954 (qInfo->IsPVPQuest() && (GetGroup()->isBFGroup() || GetGroup()->isBGGroup()))))
1955 {
1956 if (!sScriptMgr->OnPlayerPassedQuestKilledMonsterCredit(this, qInfo, entry, real_entry, guid))
1957 continue;
1958
1959 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_KILL) /*&& !qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_CAST)*/)
1960 {
1961 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
1962 {
1963 // skip GO activate objective or none
1964 if (qInfo->RequiredNpcOrGo[j] <= 0)
1965 continue;
1966
1967 uint32 reqkill = qInfo->RequiredNpcOrGo[j];
1968
1969 if (reqkill == real_entry)
1970 {
1971 uint32 reqkillcount = qInfo->RequiredNpcOrGoCount[j];
1972 uint16 curkillcount = q_status.CreatureOrGOCount[j];
1973 if (curkillcount < reqkillcount)
1974 {
1975 q_status.CreatureOrGOCount[j] = curkillcount + addkillcount;
1976
1977 m_QuestStatusSave[questid] = true;
1978
1979 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curkillcount, addkillcount);
1980 }
1981 if (CanCompleteQuest(questid))
1982 CompleteQuest(questid);
1983 else
1985
1986 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
1987 break;
1988 }
1989 }
1990 }
1991 }
1992 }
1993}
@ ACHIEVEMENT_TIMED_TYPE_CREATURE
Definition DBCEnums.h:114
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE
Definition DBCEnums.h:122
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:2357
bool IsPVPQuest() const
Definition QuestDef.h:295
Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:210

References ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_TIMED_TYPE_CREATURE, ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, Map::GetCreature(), GetDifficulty(), Object::GetEntry(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), Quest::IsPVPQuest(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_KILL, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, sScriptMgr, StartTimedAchievement(), QuestStatusData::Status, and UpdateAchievementCriteria().

Referenced by npc_dragonmaw_peon::npc_dragonmaw_peonAI::CreditPlayer(), BattlegroundAV::EventPlayerAssaultsPoint(), BattlegroundAB::EventPlayerClickedOnFlag(), go_tadpole_cage::go_tadpole_cageAI::GossipHello(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), spell_q10714_on_spirits_wings::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q12659_ahunaes_knife::HandleDummy(), spell_q9874_liquid_fire::HandleDummy(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), OutdoorPvPNA::HandleKillImpl(), BattlegroundAV::HandleKillUnit(), spell_q12805_lifeblood_dummy::HandleScript(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q11065_wrangle_some_aether_rays_aura::if(), spell_gen_have_item_auras::if(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), KilledMonster(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_creditmarker_visit_with_ancestors::npc_creditmarker_visit_with_ancestorsAI::MoveInLineOfSight(), go_scourge_enclosure::OnGossipHello(), go_warmaul_prison::OnGossipHello(), go_scourge_cage::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), go_veil_skith_cage::OnGossipHello(), npc_captain_saeed::OnGossipSelect(), spell_q12937_relief_for_the_fallen::OnRemove(), RewardPlayerAndGroupAtEvent(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), npc_hallows_end_train_fire::SpellHit(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ KilledPlayerCredit()

void Player::KilledPlayerCredit ( uint16  count = 1)
1996{
1997 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
1998 {
1999 uint32 questid = GetQuestSlotQuestId(i);
2000 if (!questid)
2001 {
2002 continue;
2003 }
2004
2005 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2006 if (!qInfo)
2007 {
2008 continue;
2009 }
2010
2011 // just if !ingroup || !noraidgroup || raidgroup
2012 QuestStatusData& q_status = m_QuestStatus[questid];
2013 if (q_status.Status == QUEST_STATUS_INCOMPLETE && (!GetGroup() || !GetGroup()->isRaidGroup() || qInfo->IsAllowedInRaid(GetMap()->GetDifficulty())))
2014 {
2015 // Xinef: PvP Killing quest require player to be in same zone as quest zone (only 2 quests so no doubt, can be extended to conditions in cata ;s)
2016 if (qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL) && (qInfo->GetZoneOrSort() >= 0 && GetZoneId() == uint32(qInfo->GetZoneOrSort())))
2017 {
2018 KilledPlayerCreditForQuest(count, qInfo);
2019 break; // there is only one quest per zone
2020 }
2021 }
2022 }
2023}
void KilledPlayerCreditForQuest(uint16 count, Quest const *quest)
Definition PlayerQuest.cpp:2025
int32 GetZoneOrSort() const
Definition QuestDef.h:230

References GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetQuestSlotQuestId(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), Quest::HasSpecialFlag(), Quest::IsAllowedInRaid(), KilledPlayerCreditForQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by KillRewarder::_RewardPlayer().

◆ KilledPlayerCreditForQuest()

void Player::KilledPlayerCreditForQuest ( uint16  count,
Quest const *  quest 
)
2026{
2027 uint32 const questId = quest->GetQuestId();
2028
2029 auto it = m_QuestStatus.find(questId);
2030 if (it == m_QuestStatus.end())
2031 {
2032 return;
2033 }
2034
2035 QuestStatusData& questStatus = it->second;
2036
2037 uint16 curKill = questStatus.PlayerCount;
2038 uint32 reqKill = quest->GetPlayersSlain();
2039
2040 if (curKill < reqKill)
2041 {
2042 count = std::min<uint16>(reqKill - curKill, count);
2043 questStatus.PlayerCount = curKill + count;
2044
2045 m_QuestStatusSave[quest->GetQuestId()] = true;
2046
2047 SendQuestUpdateAddPlayer(quest, curKill, count);
2048 }
2049
2050 if (CanCompleteQuest(questId))
2051 {
2052 CompleteQuest(questId);
2053 }
2054}
void SendQuestUpdateAddPlayer(Quest const *quest, uint16 old_count, uint16 add_count)
Definition PlayerQuest.cpp:2479

References CanCompleteQuest(), CompleteQuest(), Quest::GetPlayersSlain(), Quest::GetQuestId(), m_QuestStatus, m_QuestStatusSave, QuestStatusData::PlayerCount, and SendQuestUpdateAddPlayer().

Referenced by KilledPlayerCredit().

◆ KillPlayer()

void Player::KillPlayer ( )
4571{
4572 if (IsFlying() && !GetTransport())
4574
4575 SendMoveRoot(true);
4576
4577 StopMirrorTimers(); //disable timers(bars)
4578
4580 //SetUnitFlag(UNIT_FLAG_NOT_IN_PVP);
4581
4584
4585 // 6 minutes until repop at graveyard
4587
4588 UpdateCorpseReclaimDelay(); // dependent at use SetDeathPvP() call before kill
4589
4590 int32 corpseReclaimDelay = CalculateCorpseReclaimDelay();
4591
4592 if (corpseReclaimDelay >= 0)
4593 SendCorpseReclaimDelay(corpseReclaimDelay);
4594
4595 sScriptMgr->OnPlayerJustDied(this);
4596 // don't create corpse at this moment, player might be falling
4597
4598 // update visibility
4599 //UpdateObjectVisibility(); // pussywizard: not needed
4600}
@ PLAYER_FIELD_BYTE_RELEASE_TIMER
Definition Player.h:554
@ UNIT_DYNFLAG_NONE
Definition SharedDefines.h:3370
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:676
void ApplyModFlag(uint16 index, uint32 flag, bool apply)
Definition Object.cpp:888
void UpdateCorpseReclaimDelay()
Definition PlayerUpdates.cpp:1915
void setDeathState(DeathState s, bool despawn=false) override
Definition Player.cpp:1028
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:754
MotionMaster * GetMotionMaster()
Definition Unit.h:1713
bool HasPreventResurectionAura() const
Definition Unit.h:1762
bool IsFlying() const
Definition Unit.h:1668

References Object::ApplyModFlag(), CalculateCorpseReclaimDelay(), Corpse, WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetTransport(), Unit::HasPreventResurectionAura(), IN_MILLISECONDS, Unit::IsFlying(), m_deathTimer, MINUTE, MotionMaster::MoveFall(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, Unit::ReplaceAllDynamicFlags(), SendCorpseReclaimDelay(), Unit::SendMoveRoot(), setDeathState(), sMapStore, sScriptMgr, StopMirrorTimers(), UNIT_DYNFLAG_NONE, and UpdateCorpseReclaimDelay().

Referenced by WorldSession::HandleRepopRequestOpcode(), WorldSession::LogoutPlayer(), and Update().

◆ LearnCustomSpells()

void Player::LearnCustomSpells ( )
11888{
11889 if (!sWorld->getBoolConfig(CONFIG_START_CUSTOM_SPELLS))
11890 {
11891 return;
11892 }
11893
11894 // learn default race/class spells
11895 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11896 ASSERT(info);
11897 for (PlayerCreateInfoSpells::const_iterator itr = info->customSpells.begin(); itr != info->customSpells.end(); ++itr)
11898 {
11899 uint32 tspell = *itr;
11900 LOG_DEBUG("entities.player.loading", "Player::LearnCustomSpells: Player '{}' ({}, Class: {} Race: {}): Adding initial spell (SpellID: {})",
11901 GetName(), GetGUID().ToString(), uint32(getClass()), uint32(getRace()), tspell);
11902 if (!IsInWorld()) // will send in INITIAL_SPELLS in list anyway at map add
11903 {
11904 addSpell(tspell, SPEC_MASK_ALL, true);
11905 }
11906 else // but send in normal spell in game learn case
11907 {
11908 learnSpell(tspell);
11909 }
11910 }
11911}
@ CONFIG_START_CUSTOM_SPELLS
Definition WorldConfig.h:84
PlayerCreateInfoSpells customSpells
Definition Player.h:344

References addSpell(), ASSERT, CONFIG_START_CUSTOM_SPELLS, PlayerInfo::customSpells, Unit::getClass(), Object::GetGUID(), WorldObject::GetName(), Unit::getRace(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, sObjectMgr, SPEC_MASK_ALL, sWorld, and Position::ToString().

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnDefaultSkill()

void Player::LearnDefaultSkill ( uint32  skillId,
uint16  rank 
)
11928{
11929 SkillRaceClassInfoEntry const* rcInfo = GetSkillRaceClassInfo(skillId, getRace(), getClass());
11930 if (!rcInfo)
11931 return;
11932
11933 LOG_DEBUG("entities.player.loading", "PLAYER (Class: {} Race: {}): Adding initial skill, id = {}", uint32(getClass()), uint32(getRace()), skillId);
11934 switch (GetSkillRangeType(rcInfo))
11935 {
11937 SetSkill(skillId, 0, 300, 300);
11938 break;
11939 case SKILL_RANGE_LEVEL:
11940 {
11941 uint16 skillValue = 1;
11942 uint16 maxValue = GetMaxSkillValueForLevel();
11943 if (sWorld->getBoolConfig(CONFIG_ALWAYS_MAXSKILL) && !IsProfessionOrRidingSkill(skillId))
11944 {
11945 skillValue = maxValue;
11946 }
11947 else if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11948 {
11949 skillValue = maxValue;
11950 }
11952 {
11953 skillValue = std::min(std::max<uint16>({ 1, uint16((GetLevel() - 1) * 5) }), maxValue);
11954 }
11955 else if (skillId == SKILL_FIST_WEAPONS)
11956 {
11957 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_UNARMED));
11958 }
11959 else if (skillId == SKILL_LOCKPICKING)
11960 {
11961 skillValue = std::max<uint16>(1, GetSkillValue(SKILL_LOCKPICKING));
11962 }
11963
11964 SetSkill(skillId, 0, skillValue, maxValue);
11965 break;
11966 }
11967 case SKILL_RANGE_MONO:
11968 SetSkill(skillId, 0, 1, 1);
11969 break;
11970 case SKILL_RANGE_RANK:
11971 {
11972 if (!rank)
11973 {
11974 break;
11975 }
11976
11977 SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID);
11978 uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)];
11979 uint16 skillValue = 1;
11980 if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE)
11981 {
11982 skillValue = maxValue;
11983 }
11985 {
11986 skillValue = std::min(std::max<uint16>({ uint16(1), uint16((GetLevel() - 1) * 5) }), maxValue);
11987 }
11988
11989 SetSkill(skillId, rank, skillValue, maxValue);
11990 break;
11991 }
11992 default:
11993 break;
11994 }
11995}
@ SKILL_FLAG_ALWAYS_MAX_VALUE
Definition DBCEnums.h:386
@ SKILL_RANGE_RANK
Definition ObjectMgr.h:676
bool IsProfessionOrRidingSkill(uint32 skill)
Definition SpellMgr.h:623
@ CLASS_CONTEXT_SKILL
Definition UnitDefines.h:236
uint32 SkillTierID
Definition DBCStructure.h:1577
uint32 Flags
Definition DBCStructure.h:1575
uint32 Value[MAX_SKILL_STEP]
Definition DBCStructure.h:1619

References CLASS_CONTEXT_SKILL, CLASS_DEATH_KNIGHT, CONFIG_ALWAYS_MAXSKILL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), Unit::GetLevel(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), GetSkillValue(), IsClass(), IsProfessionOrRidingSkill(), LOG_DEBUG, SetSkill(), SKILL_FIST_WEAPONS, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_LOCKPICKING, SKILL_RANGE_LANGUAGE, SKILL_RANGE_LEVEL, SKILL_RANGE_MONO, SKILL_RANGE_RANK, SKILL_UNARMED, SkillRaceClassInfoEntry::SkillTierID, sSkillTiersStore, sWorld, and SkillTiersEntry::Value.

Referenced by _addSpell(), and LearnDefaultSkills().

◆ LearnDefaultSkills()

void Player::LearnDefaultSkills ( )
11914{
11915 // learn default race/class skills
11916 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(), getClass());
11917 for (PlayerCreateInfoSkills::const_iterator itr = info->skills.begin(); itr != info->skills.end(); ++itr)
11918 {
11919 uint32 skillId = itr->SkillId;
11920 if (HasSkill(skillId))
11921 continue;
11922
11923 LearnDefaultSkill(skillId, itr->Rank);
11924 }
11925}
PlayerCreateInfoSkills skills
Definition Player.h:347

References Unit::getClass(), Unit::getRace(), HasSkill(), LearnDefaultSkill(), PlayerInfo::skills, and sObjectMgr.

Referenced by Create(), learn_commandscript::HandleLearnAllDefaultCommand(), LoadFromDB(), and resetSpells().

◆ LearnPetTalent()

void Player::LearnPetTalent ( ObjectGuid  petGuid,
uint32  talentId,
uint32  talentRank 
)
14127{
14128 Pet* pet = GetPet();
14129
14130 if (!pet)
14131 return;
14132
14133 if (petGuid != pet->GetGUID())
14134 return;
14135
14136 uint32 CurTalentPoints = pet->GetFreeTalentPoints();
14137
14138 if (CurTalentPoints == 0)
14139 return;
14140
14141 if (talentRank >= MAX_PET_TALENT_RANK)
14142 return;
14143
14144 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14145
14146 if (!talentInfo)
14147 return;
14148
14149 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14150
14151 if (!talentTabInfo)
14152 return;
14153
14154 CreatureTemplate const* ci = pet->GetCreatureTemplate();
14155
14156 if (!ci)
14157 return;
14158
14159 CreatureFamilyEntry const* pet_family = sCreatureFamilyStore.LookupEntry(ci->family);
14160
14161 if (!pet_family)
14162 return;
14163
14164 if (pet_family->petTalentType < 0) // not hunter pet
14165 return;
14166
14167 // prevent learn talent for different family (cheating)
14168 if (!((1 << pet_family->petTalentType) & talentTabInfo->petTalentMask))
14169 return;
14170
14171 // find current max talent rank (0~5)
14172 uint8 curtalent_maxrank = 0; // 0 = not learned any rank
14173 for (int8 rank = MAX_TALENT_RANK - 1; rank >= 0; --rank)
14174 {
14175 if (talentInfo->RankID[rank] && pet->HasSpell(talentInfo->RankID[rank]))
14176 {
14177 curtalent_maxrank = (rank + 1);
14178 break;
14179 }
14180 }
14181
14182 // we already have same or higher talent rank learned
14183 if (curtalent_maxrank >= (talentRank + 1))
14184 return;
14185
14186 // check if we have enough talent points
14187 if (CurTalentPoints < (talentRank - curtalent_maxrank + 1))
14188 return;
14189
14190 // Check if it requires another talent
14191 if (talentInfo->DependsOn > 0)
14192 {
14193 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14194 {
14195 bool hasEnoughRank = false;
14196 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14197 {
14198 if (depTalentInfo->RankID[rank] != 0)
14199 if (pet->HasSpell(depTalentInfo->RankID[rank]))
14200 hasEnoughRank = true;
14201 }
14202 if (!hasEnoughRank)
14203 return;
14204 }
14205 }
14206
14207 // Find out how many points we have in this field
14208 uint32 spentPoints = 0;
14209
14210 uint32 tTab = talentInfo->TalentTab;
14211 if (talentInfo->Row > 0)
14212 {
14213 uint32 numRows = sTalentStore.GetNumRows();
14214 for (uint32 i = 0; i < numRows; ++i) // Loop through all talents.
14215 {
14216 // Someday, someone needs to revamp
14217 const TalentEntry* tmpTalent = sTalentStore.LookupEntry(i);
14218 if (tmpTalent) // the way talents are tracked
14219 {
14220 if (tmpTalent->TalentTab == tTab)
14221 {
14222 for (uint8 rank = 0; rank < MAX_TALENT_RANK; rank++)
14223 {
14224 if (tmpTalent->RankID[rank] != 0)
14225 {
14226 if (pet->HasSpell(tmpTalent->RankID[rank]))
14227 {
14228 spentPoints += (rank + 1);
14229 }
14230 }
14231 }
14232 }
14233 }
14234 }
14235 }
14236
14237 // not have required min points spent in talent tree
14238 if (spentPoints < (talentInfo->Row * MAX_PET_TALENT_RANK))
14239 return;
14240
14241 // spell not set in talent.dbc
14242 uint32 spellid = talentInfo->RankID[talentRank];
14243 if (spellid == 0)
14244 {
14245 LOG_ERROR("entities.player", "Talent.dbc have for talent: {} Rank: {} spell id = 0", talentId, talentRank);
14246 return;
14247 }
14248
14249 // already known
14250 if (pet->HasSpell(spellid))
14251 return;
14252
14253 // learn! (other talent ranks will unlearned at learning)
14254 pet->learnSpell(spellid);
14255 LOG_DEBUG("entities.player", "PetTalentID: {} Rank: {} Spell: {}\n", talentId, talentRank, spellid);
14256
14257 // update free talent points
14258 pet->SetFreeTalentPoints(CurTalentPoints - (talentRank - curtalent_maxrank + 1));
14259}
#define MAX_PET_TALENT_RANK
Definition DBCStructure.h:1920
void SetFreeTalentPoints(uint8 points)
Definition Pet.h:132
bool learnSpell(uint32 spell_id)
Definition Pet.cpp:1915
uint32 Row
Definition DBCStructure.h:1927
uint32 DependsOnRank
Definition DBCStructure.h:1933
uint32 DependsOn
Definition DBCStructure.h:1931

References TalentEntry::DependsOn, TalentEntry::DependsOnRank, CreatureTemplate::family, Creature::GetCreatureTemplate(), Pet::GetFreeTalentPoints(), Object::GetGUID(), GetPet(), Pet::HasSpell(), Pet::learnSpell(), LOG_DEBUG, LOG_ERROR, MAX_PET_TALENT_RANK, MAX_TALENT_RANK, TalentTabEntry::petTalentMask, CreatureFamilyEntry::petTalentType, TalentEntry::RankID, TalentEntry::Row, sCreatureFamilyStore, Pet::SetFreeTalentPoints(), sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by WorldSession::HandleLearnPreviewTalentsPet(), and WorldSession::HandlePetLearnTalent().

◆ learnQuestRewardedSpells() [1/2]

void Player::learnQuestRewardedSpells ( )
12030{
12031 // learn spells received from quest completing
12032 for (RewardedQuestSet::const_iterator itr = m_RewardedQuests.begin(); itr != m_RewardedQuests.end(); ++itr)
12033 {
12034 Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
12035 if (!quest)
12036 continue;
12037
12039 }
12040}

References learnQuestRewardedSpells(), m_RewardedQuests, and sObjectMgr.

Referenced by _LoadQuestStatusRewarded(), learn_commandscript::HandleLearnAllDefaultCommand(), learnQuestRewardedSpells(), and resetSpells().

◆ learnQuestRewardedSpells() [2/2]

void Player::learnQuestRewardedSpells ( Quest const *  quest)
11998{
11999 // xinef: quest does not learn anything
12000 int32 spellId = quest->GetRewSpellCast();
12001 if (!spellId)
12002 return;
12003
12004 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
12005 if (!spellInfo)
12006 return;
12007
12008 // xinef: find effect with learn spell and check if we have this spell
12009 bool found = false;
12010 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12011 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL && spellInfo->Effects[i].TriggerSpell && !HasSpell(spellInfo->Effects[i].TriggerSpell))
12012 {
12013 // pusywizard: don't re-add profession specialties!
12014 if (SpellInfo const* triggeredInfo = sSpellMgr->GetSpellInfo(spellInfo->Effects[i].TriggerSpell))
12015 if (triggeredInfo->Effects[0].Effect == SPELL_EFFECT_TRADE_SKILL)
12016 break; // pussywizard: break and not cast the spell (found is false)
12017
12018 found = true;
12019 break;
12020 }
12021
12022 // xinef: we know the spell, return
12023 if (!found)
12024 return;
12025
12026 CastSpell(this, spellId, true);
12027}
@ SPELL_EFFECT_TRADE_SKILL
Definition SharedDefines.h:836

References Unit::CastSpell(), SpellInfo::Effects, Quest::GetRewSpellCast(), HasSpell(), MAX_SPELL_EFFECTS, SPELL_EFFECT_LEARN_SPELL, SPELL_EFFECT_TRADE_SKILL, and sSpellMgr.

◆ learnSkillRewardedSpells()

void Player::learnSkillRewardedSpells ( uint32  id,
uint32  value 
)
12043{
12044 uint32 raceMask = getRaceMask();
12045 uint32 classMask = getClassMask();
12046 for (SkillLineAbilityEntry const* pAbility : GetSkillLineAbilitiesBySkillLine(skill_id))
12047 {
12048 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(pAbility->Spell);
12049 if (!spellInfo)
12050 {
12051 continue;
12052 }
12053
12054 if (pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE && pAbility->AcquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
12055 {
12056 continue;
12057 }
12058
12059 // Check race if set
12060 if (pAbility->RaceMask && !(pAbility->RaceMask & raceMask))
12061 {
12062 continue;
12063 }
12064
12065 // Check class if set
12066 if (pAbility->ClassMask && !(pAbility->ClassMask & classMask))
12067 {
12068 continue;
12069 }
12070
12071 // need unlearn spell
12072 if (skill_value < pAbility->MinSkillLineRank && pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
12073 {
12074 removeSpell(pAbility->Spell, GetActiveSpec(), true);
12075 }
12076 // need learn
12077 else
12078 {
12079 //used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn
12080 if (pAbility->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && pAbility->SupercededBySpell)
12081 {
12082 bool skipCurrent = false;
12083 auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(pAbility->SupercededBySpell);
12084 for (auto itr = bounds.first; itr != bounds.second; ++itr)
12085 {
12086 if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skill_value >= itr->second->MinSkillLineRank)
12087 {
12088 skipCurrent = true;
12089 break;
12090 }
12091 }
12092 if (skipCurrent)
12093 {
12094 continue;
12095 }
12096 }
12097
12098 if (!IsInWorld())
12099 {
12100 addSpell(pAbility->Spell, SPEC_MASK_ALL, true, true);
12101 }
12102 else
12103 {
12104 learnSpell(pAbility->Spell, true, true);
12105 }
12106 }
12107 }
12108}
@ SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE
Definition DBCEnums.h:360
const std::vector< SkillLineAbilityEntry const * > & GetSkillLineAbilitiesBySkillLine(uint32 skillLine)
Definition DBCStores.cpp:916
Definition DBCStructure.h:1599

References addSpell(), GetActiveSpec(), Unit::getClassMask(), Unit::getRaceMask(), GetSkillLineAbilitiesBySkillLine(), Object::IsInWorld(), learnSpell(), removeSpell(), SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN, SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE, SPEC_MASK_ALL, and sSpellMgr.

Referenced by _LoadSkills(), SetSkill(), and UpdateSkillPro().

◆ learnSpell()

void Player::learnSpell ( uint32  spellId,
bool  temporary = false,
bool  learnFromSkill = false 
)
3304{
3305 // Xinef: don't allow to learn active spell once more
3306 if (HasActiveSpell(spellId))
3307 {
3308 LOG_DEBUG("entities.player", "Player ({}) tries to learn already active spell: {}", GetGUID().ToString(), spellId);
3309 return;
3310 }
3311
3312 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spellId);
3313 bool thisSpec = GetTalentSpellCost(firstRankSpellId) > 0 || sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId);
3314 bool added = addSpell(spellId, thisSpec ? GetActiveSpecMask() : SPEC_MASK_ALL, true, temporary, learnFromSkill);
3315 if (added)
3316 {
3317 sScriptMgr->OnPlayerLearnSpell(this, spellId);
3318
3319 // pussywizard: a system message "you have learnt spell X (rank Y)"
3320 if (IsInWorld())
3321 SendLearnPacket(spellId, true);
3322 }
3323
3324 // pussywizard: rank stuff at the end!
3325 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spellId))
3326 {
3327 // pussywizard: lookup next rank in m_spells (the only talents on m_spella are for example pyroblast, that have all ranks restored upon learning rank 1)
3328 // pussywizard: next ranks must not be in current spec (otherwise no need to learn already learnt)
3329 PlayerSpellMap::iterator itr = m_spells.find(nextSpell);
3330 if (itr != m_spells.end() && itr->second->State != PLAYERSPELL_REMOVED && !itr->second->IsInSpec(m_activeSpec))
3331 learnSpell(nextSpell, temporary);
3332 }
3333
3334 // xinef: if we learn new spell, check all spells requiring this spell, if we have such a spell, and it is not in current spec - learn it
3335 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(spellId);
3336 for (SpellsRequiringSpellMap::const_iterator itr = spellsRequiringSpell.first; itr != spellsRequiringSpell.second; ++itr)
3337 {
3338 PlayerSpellMap::iterator itr2 = m_spells.find(itr->second);
3339 if (itr2 != m_spells.end() && itr2->second->State != PLAYERSPELL_REMOVED && !itr2->second->IsInSpec(m_activeSpec))
3340 learnSpell(itr2->first, temporary);
3341 }
3342}
uint32 GetTalentSpellCost(uint32 spellId)
Definition DBCStores.cpp:686

References addSpell(), GetActiveSpecMask(), Object::GetGUID(), GetTalentSpellCost(), HasActiveSpell(), Object::IsInWorld(), learnSpell(), LOG_DEBUG, m_activeSpec, m_spells, PLAYERSPELL_REMOVED, SendLearnPacket(), SPEC_MASK_ALL, sScriptMgr, sSpellMgr, and Position::ToString().

Referenced by _addSpell(), Spell::EffectLearnSpell(), learn_commandscript::HandleLearnAllGMCommand(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllMySpellsCommand(), learn_commandscript::HandleLearnSkillRecipesHelper(), Acore::PlayerCommand::HandleLearnSpellCommand(), spell_gen_profession_research::HandleScript(), spell_item_book_of_glyph_mastery::HandleScript(), WorldSession::HandleTrainerBuySpellOpcode(), LearnCustomSpells(), learnSkillRewardedSpells(), learnSpell(), learnSpellHighRank(), LearnTalent(), and UpdateCraftSkill().

◆ learnSpellHighRank()

void Player::learnSpellHighRank ( uint32  spellid)
13712{
13713 learnSpell(spellid);
13714
13715 if (uint32 next = sSpellMgr->GetNextSpellInChain(spellid))
13716 learnSpellHighRank(next);
13717}
void learnSpellHighRank(uint32 spellid)
Definition Player.cpp:13711

References learnSpell(), learnSpellHighRank(), and sSpellMgr.

Referenced by learnSpellHighRank().

◆ LearnTalent()

void Player::LearnTalent ( uint32  talentId,
uint32  talentRank,
bool  command = false 
)
13994{
13995 uint32 CurTalentPoints = GetFreeTalentPoints();
13996
13997 if (!command)
13998 {
13999 // xinef: check basic data
14000 if (!CurTalentPoints)
14001 {
14002 return;
14003 }
14004
14005 if (talentRank >= MAX_TALENT_RANK)
14006 {
14007 return;
14008 }
14009 }
14010
14011 TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
14012 if (!talentInfo)
14013 return;
14014
14015 TalentTabEntry const* talentTabInfo = sTalentTabStore.LookupEntry(talentInfo->TalentTab);
14016 if (!talentTabInfo)
14017 return;
14018
14019 // xinef: prevent learn talent for different class (cheating)
14020 if ((getClassMask() & talentTabInfo->ClassMask) == 0)
14021 return;
14022
14023 // xinef: find current talent rank
14024 uint32 currentTalentRank = 0;
14025 for (uint8 rank = 0; rank < MAX_TALENT_RANK; ++rank)
14026 {
14027 if (talentInfo->RankID[rank] && HasTalent(talentInfo->RankID[rank], GetActiveSpec()))
14028 {
14029 currentTalentRank = rank + 1;
14030 break;
14031 }
14032 }
14033
14034 // xinef: we already have same or higher rank talent learned
14035 if (currentTalentRank >= talentRank + 1)
14036 return;
14037
14038 uint32 talentPointsChange = (talentRank - currentTalentRank + 1);
14039 if (!command)
14040 {
14041 // xinef: check if we have enough free talent points
14042 if (CurTalentPoints < talentPointsChange)
14043 {
14044 return;
14045 }
14046 }
14047
14048 // xinef: check if talent deponds on another talent
14049 if (talentInfo->DependsOn > 0)
14050 if (TalentEntry const* depTalentInfo = sTalentStore.LookupEntry(talentInfo->DependsOn))
14051 {
14052 bool hasEnoughRank = false;
14053 for (uint8 rank = talentInfo->DependsOnRank; rank < MAX_TALENT_RANK; rank++)
14054 {
14055 if (depTalentInfo->RankID[rank] != 0)
14056 if (HasTalent(depTalentInfo->RankID[rank], GetActiveSpec()))
14057 {
14058 hasEnoughRank = true;
14059 break;
14060 }
14061 }
14062
14063 // xinef: does not have enough talent points spend in required talent
14064 if (!hasEnoughRank)
14065 return;
14066 }
14067
14068 if (!command)
14069 {
14070 // xinef: check amount of points spent in current talent tree
14071 // xinef: be smart and quick
14072 uint32 spentPoints = 0;
14073 if (talentInfo->Row > 0)
14074 {
14075 const PlayerTalentMap& talentMap = GetTalentMap();
14076 for (PlayerTalentMap::const_iterator itr = talentMap.begin(); itr != talentMap.end(); ++itr)
14077 if (TalentSpellPos const* talentPos = GetTalentSpellPos(itr->first))
14078 if (TalentEntry const* itrTalentInfo = sTalentStore.LookupEntry(talentPos->talent_id))
14079 if (itrTalentInfo->TalentTab == talentInfo->TalentTab)
14080 if (itr->second->State != PLAYERSPELL_REMOVED && itr->second->IsInSpec(GetActiveSpec())) // pussywizard
14081 spentPoints += talentPos->rank + 1;
14082 }
14083
14084 // xinef: we do not have enough talent points to add talent of this tier
14085 if (spentPoints < (talentInfo->Row * MAX_TALENT_RANK))
14086 return;
14087 }
14088
14089 // xinef: hacking attempt, tries to learn unknown rank
14090 uint32 spellId = talentInfo->RankID[talentRank];
14091 if (spellId == 0)
14092 return;
14093
14094 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
14095 if (!spellInfo)
14096 return;
14097
14098 bool learned = false;
14099
14100 // xinef: if talent info has special marker in dbc - add to spell book
14101 if (talentInfo->addToSpellBook)
14102 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
14103 {
14104 learnSpell(spellId);
14105 learned = true;
14106 }
14107
14108 if (!learned)
14109 SendLearnPacket(spellId, true);
14110
14111 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
14112 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
14113 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
14114 learnSpell(spellInfo->Effects[i].TriggerSpell);
14115
14116 addTalent(spellId, GetActiveSpecMask(), currentTalentRank);
14117
14118 if (!command)
14119 {
14120 SetFreeTalentPoints(CurTalentPoints - talentPointsChange);
14121 }
14122
14123 sScriptMgr->OnPlayerLearnTalents(this, talentId, talentRank, spellId);
14124}
uint32 ClassMask
Definition DBCStructure.h:1947

References addTalent(), TalentEntry::addToSpellBook, TalentTabEntry::ClassMask, TalentEntry::DependsOn, TalentEntry::DependsOnRank, SpellInfo::Effects, GetActiveSpec(), GetActiveSpecMask(), Unit::getClassMask(), GetFreeTalentPoints(), GetTalentMap(), GetTalentSpellPos(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasTalent(), learnSpell(), MAX_SPELL_EFFECTS, MAX_TALENT_RANK, PLAYERSPELL_REMOVED, TalentEntry::RankID, TalentEntry::Row, SendLearnPacket(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sTalentTabStore, and TalentEntry::TalentTab.

Referenced by learn_commandscript::HandleLearnAllMyTalentsCommand(), WorldSession::HandleLearnPreviewTalents(), and WorldSession::HandleLearnTalentOpcode().

◆ LeaveAllArenaTeams()

void Player::LeaveAllArenaTeams ( ObjectGuid  guid)
static
10207{
10208 // xinef: sync query
10210 stmt->SetData(0, guid.GetCounter());
10211 PreparedQueryResult result = CharacterDatabase.Query(stmt);
10212
10213 if (!result)
10214 return;
10215
10216 do
10217 {
10218 Field* fields = result->Fetch();
10219 uint32 arenaTeamId = fields[0].Get<uint32>();
10220 if (arenaTeamId != 0)
10221 {
10222 ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
10223 if (arenaTeam)
10224 arenaTeam->DelMember(guid, true);
10225 }
10226 } while (result->NextRow());
10227}
@ CHAR_SEL_PLAYER_ARENA_TEAMS
Definition CharacterDatabase.h:233
void DelMember(ObjectGuid guid, bool cleanDb)
Definition ArenaTeam.cpp:327

References CHAR_SEL_PLAYER_ARENA_TEAMS, CharacterDatabase, ArenaTeam::DelMember(), Field::Get(), ObjectGuid::GetCounter(), sArenaTeamMgr, and PreparedStatementBase::SetData().

Referenced by DeleteFromDB(), and WorldSession::HandleCharFactionOrRaceChangeCallback().

◆ LeaveBattleground()

void Player::LeaveBattleground ( Battleground bg = nullptr)
11341{
11342 if (!bg)
11343 bg = GetBattleground();
11344
11345 if (!bg)
11346 return;
11347
11348 // Deserter tracker - leave BG
11349 if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11350 {
11351 if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS))
11352 {
11354 stmt->SetData(0, GetGUID().GetCounter());
11356 CharacterDatabase.Execute(stmt);
11357 }
11358 sScriptMgr->OnPlayerBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG);
11359 }
11360
11361 if (bg->isArena() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN))
11362 sScriptMgr->OnPlayerBattlegroundDesertion(this, ARENA_DESERTION_TYPE_LEAVE_BG);
11363
11364 // xinef: reset corpse reclaim time
11366
11367 // Remove all dots
11371
11372 // pussywizard: clear movement, because after porting player will move to arena cords
11374 StopMoving();
11376}
@ BG_DESERTION_TYPE_LEAVE_BG
Definition Battleground.h:52
@ ARENA_DESERTION_TYPE_LEAVE_BG
Definition Battleground.h:57
@ STATUS_WAIT_JOIN
Definition Battleground.h:192
@ CHAR_INS_DESERTER_TRACK
Definition CharacterDatabase.h:501
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116
@ CONFIG_BATTLEGROUND_TRACK_DESERTERS
Definition WorldConfig.h:75
bool isBattleground() const
Definition Battleground.h:405
BattlegroundStatus GetStatus() const
Definition Battleground.h:323
void MovementExpired(bool reset=true)
Definition MotionMaster.h:195
bool TeleportToEntryPoint()
Definition Player.cpp:1597
void StopMoving()
Definition Unit.cpp:16660

References ARENA_DESERTION_TYPE_LEAVE_BG, BG_DESERTION_TYPE_LEAVE_BG, CHAR_INS_DESERTER_TRACK, CharacterDatabase, CONFIG_BATTLEGROUND_TRACK_DESERTERS, GetBattleground(), GameTime::GetGameTime(), Object::GetGUID(), Unit::GetMotionMaster(), Battleground::GetStatus(), Battleground::isArena(), Battleground::isBattleground(), m_deathExpireTime, MotionMaster::MovementExpired(), Unit::RemoveAurasByType(), PreparedStatementBase::SetData(), SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_LEECH, sScriptMgr, STATUS_IN_PROGRESS, STATUS_WAIT_JOIN, Unit::StopMoving(), sWorld, and TeleportToEntryPoint().

Referenced by BattlegroundAB::HandleAreaTrigger(), BattlegroundAV::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::LogoutPlayer(), and ToggleAFK().

◆ LeftChannel()

void Player::LeftChannel ( Channel c)
5017{
5018 m_channels.remove(c);
5019}

References m_channels.

Referenced by Channel::KickOrBan(), Channel::LeaveChannel(), and UpdateLocalChannels().

◆ LoadActions()

void Player::LoadActions ( PreparedQueryResult  result)
15392{
15393 if (result)
15394 _LoadActions(result);
15395
15397}
void _LoadActions(PreparedQueryResult result)
Definition PlayerStorage.cpp:5679

References _LoadActions(), and SendActionButtons().

◆ LoadCorpse()

void Player::LoadCorpse ( PreparedQueryResult  result)
5822{
5824 SpawnCorpseBones(false);
5825
5826 if (!IsAlive())
5827 {
5828 if (result && !HasAtLoginFlag(AT_LOGIN_RESURRECT))
5829 {
5830 Field* fields = result->Fetch();
5831 _corpseLocation.WorldRelocate(fields[0].Get<uint16>(), fields[1].Get<float>(), fields[2].Get<float>(), fields[3].Get<float>(), fields[4].Get<float>());
5833 }
5834 else
5835 ResurrectPlayer(0.5f);
5836 }
5837
5839}
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
Definition Player.cpp:14755
bool HasAtLoginFlag(AtLoginFlags f) const
Definition Player.h:2406
void ResurrectPlayer(float restore_percent, bool applySickness=false)
Definition Player.cpp:4487

References _corpseLocation, Object::ApplyModFlag(), AT_LOGIN_RESURRECT, WorldLocation::GetMapId(), HasAtLoginFlag(), Unit::IsAlive(), PLAYER_FIELD_BYTE_RELEASE_TIMER, PLAYER_FIELD_BYTES, RemoveAtLoginFlag(), ResurrectPlayer(), sMapStore, SpawnCorpseBones(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadFromDB()

bool Player::LoadFromDB ( ObjectGuid  guid,
CharacterDatabaseQueryHolder const &  holder 
)
4925{
4927 //QueryResult* result = CharacterDatabase.Query("SELECT guid, account, name, race, class, gender, level, xp, money, skin, face, hairStyle, hairColor, facialStyle, bankSlots, restState, playerFlags, "
4928 // 17 18 19 20 21 22 23 24 25 26 27 28 29
4929 //"position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
4930 // 30 31 32 33 34 35 36 37 38 39 40 41 42 43
4931 //"resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, instance_mode_mask, "
4932 // 44 45 46 47 48 49 50 51 52 53 54
4933 //"arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, "
4934 // 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
4935 //"health, power1, power2, power3, power4, power5, power6, power7, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, ammoId, knownTitles,
4936 // 70 71 72 73 74
4937 //"actionBars, grantableLevels, innTriggerId, extraBonusTalentCount, UNIX_TIMESTAMP(creation_date) FROM characters WHERE guid = '{}'", guid);
4938 PreparedQueryResult result = holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM);
4939
4940 if (!result)
4941 {
4942 LOG_ERROR("entities.player", "Player ({}) not found in table `characters`, can't load. ", playerGuid.ToString());
4943 return false;
4944 }
4945
4946 Field* fields = result->Fetch();
4947
4948 uint32 dbAccountId = fields[1].Get<uint32>();
4949
4950 // check if the character's account in the db and the logged in account match.
4951 // player should be able to load/delete character only with correct account!
4952 if (dbAccountId != GetSession()->GetAccountId())
4953 {
4954 LOG_ERROR("entities.player", "Player ({}) loading from wrong account (is: {}, should be: {})", playerGuid.ToString(), GetSession()->GetAccountId(), dbAccountId);
4955 return false;
4956 }
4957
4958 if (holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_BANNED))
4959 {
4960 LOG_ERROR("entities.player", "Player ({}) is banned, can't load.", playerGuid.ToString());
4961 return false;
4962 }
4963
4964 ObjectGuid::LowType guid = playerGuid.GetCounter();
4965
4967
4968 m_name = fields[2].Get<std::string>();
4969
4970 // check name limitations
4972 {
4974 stmt->SetData(0, uint16(AT_LOGIN_RENAME));
4975 stmt->SetData(1, guid);
4976 CharacterDatabase.Execute(stmt);
4977 return false;
4978 }
4979
4980 uint8 Gender = fields[5].Get<uint8>();
4981 if (!IsValidGender(Gender))
4982 {
4983 LOG_ERROR("entities.player", "Player (GUID: {}) has wrong gender ({}), can't be loaded.", guid, Gender);
4984 return false;
4985 }
4986
4987 // overwrite some data fields
4988 uint32 bytes0 = 0;
4989 bytes0 |= fields[3].Get<uint8>(); // race
4990 bytes0 |= fields[4].Get<uint8>() << 8; // class
4991 bytes0 |= Gender << 16; // gender
4993
4994 m_realRace = fields[3].Get<uint8>(); // set real race
4995 m_race = fields[3].Get<uint8>(); // set real race
4996
4997 SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].Get<uint8>());
4998 SetUInt32Value(PLAYER_XP, fields[7].Get<uint32>());
4999
5000 if (!_LoadIntoDataField(fields[66].Get<std::string>(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE))
5001 {
5002 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid exploredzones data ({}). Forcing partial load.", guid, fields[66].Get<std::string_view>());
5003 }
5004
5005 if (!_LoadIntoDataField(fields[69].Get<std::string>(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE * 2))
5006 {
5007 LOG_WARN("entities.player.loading", "Player::LoadFromDB: Player ({}) has invalid knowntitles mask ({}). Forcing partial load.", guid, fields[69].Get<std::string_view>());
5008 }
5009
5010 SetObjectScale(1.0f);
5012
5013 // load character creation date, relevant for achievements of type average
5014 SetCreationTime(fields[74].Get<Seconds>());
5015
5016 // load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
5018
5019 uint32 money = fields[8].Get<uint32>();
5020 if (money > MAX_MONEY_AMOUNT)
5021 money = MAX_MONEY_AMOUNT;
5022 SetMoney(money);
5023
5024 SetByteValue(PLAYER_BYTES, 0, fields[9].Get<uint8>());
5025 SetByteValue(PLAYER_BYTES, 1, fields[10].Get<uint8>());
5026 SetByteValue(PLAYER_BYTES, 2, fields[11].Get<uint8>());
5027 SetByteValue(PLAYER_BYTES, 3, fields[12].Get<uint8>());
5028 SetByteValue(PLAYER_BYTES_2, 0, fields[13].Get<uint8>());
5029 SetByteValue(PLAYER_BYTES_2, 2, fields[14].Get<uint8>());
5030 SetByteValue(PLAYER_BYTES_2, 3, fields[15].Get<uint8>());
5031 SetByteValue(PLAYER_BYTES_3, 0, fields[5].Get<uint8>());
5032 SetByteValue(PLAYER_BYTES_3, 1, fields[54].Get<uint8>());
5033 ReplaceAllPlayerFlags((PlayerFlags)fields[16].Get<uint32>());
5034 SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, fields[53].Get<uint32>());
5035
5036 SetUInt64Value(PLAYER_FIELD_KNOWN_CURRENCIES, fields[52].Get<uint64>());
5037
5038 SetUInt32Value(PLAYER_AMMO_ID, fields[68].Get<uint32>());
5039
5040 // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise)
5041 SetByteValue(PLAYER_FIELD_BYTES, 2, fields[70].Get<uint8>());
5042
5044
5045 // cleanup inventory related item value fields (its will be filled correctly in _LoadInventory)
5046 for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
5047 {
5049 SetVisibleItemSlot(slot, nullptr);
5050
5051 delete m_items[slot];
5052 m_items[slot] = nullptr;
5053 }
5054
5055 LOG_DEBUG("entities.player.loading", "Load Basic value of player {} is: ", m_name);
5057
5058 //Need to call it to initialize m_team (m_team can be calculated from race)
5059 //Other way is to saves m_team into characters table.
5061
5062 // pussywizard: create empty instance bind containers if necessary
5063 sInstanceSaveMgr->PlayerCreateBoundInstancesMaps(playerGuid);
5064
5065 // load home bind and check in same time class/race pair, it used later for restore broken positions
5066 if (!_LoadHomeBind(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_HOME_BIND)))
5067 return false;
5068
5069 InitPrimaryProfessions(); // to max set before any spell loaded
5070
5071 // init saved position, and fix it later if problematic
5072 int32 transLowGUID = fields[35].Get<int32>();
5073 Relocate(fields[17].Get<float>(), fields[18].Get<float>(), fields[19].Get<float>(), fields[21].Get<float>());
5074 uint32 mapId = fields[20].Get<uint16>();
5075 uint32 instanceId = fields[63].Get<uint32>();
5076
5077 uint32 dungeonDiff = fields[43].Get<uint8>() & 0x0F;
5078 if (dungeonDiff >= MAX_DUNGEON_DIFFICULTY)
5079 dungeonDiff = DUNGEON_DIFFICULTY_NORMAL;
5080 uint32 raidDiff = (fields[43].Get<uint8>() >> 4) & 0x0F;
5081 if (raidDiff >= MAX_RAID_DIFFICULTY)
5083 SetDungeonDifficulty(Difficulty(dungeonDiff)); // may be changed in _LoadGroup
5084 SetRaidDifficulty(Difficulty(raidDiff)); // may be changed in _LoadGroup
5085
5086 std::string taxi_nodes = fields[42].Get<std::string>();
5087
5088 auto RelocateToHomebind = [this, &mapId, &instanceId]() { mapId = m_homebindMapId; instanceId = 0; Relocate(m_homebindX, m_homebindY, m_homebindZ); };
5089
5090 _LoadGroup();
5091
5093
5094 SetArenaPoints(fields[44].Get<uint32>());
5095
5096 SetHonorPoints(fields[45].Get<uint32>());
5097 SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, fields[46].Get<uint32>());
5098 SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, fields[47].Get<uint32>());
5099 SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, fields[48].Get<uint32>());
5100 SetUInt16Value(PLAYER_FIELD_KILLS, 0, fields[49].Get<uint16>());
5101 SetUInt16Value(PLAYER_FIELD_KILLS, 1, fields[50].Get<uint16>());
5102
5105
5106 GetSession()->SetPlayer(this);
5107 MapEntry const* mapEntry = sMapStore.LookupEntry(mapId);
5108
5109 Map* map = nullptr;
5110
5111 // pussywizard: group changed difficulty when player was offline, teleport to the enterance of new difficulty
5112 if (mapEntry && ((mapEntry->IsNonRaidDungeon() && dungeonDiff != GetDungeonDifficulty()) || (mapEntry->IsRaid() && raidDiff != GetRaidDifficulty())))
5113 {
5114 bool fixed = false;
5115 if (uint32 destInstId = sInstanceSaveMgr->PlayerGetDestinationInstanceId(this, mapId, GetDifficulty(mapEntry->IsRaid())))
5116 {
5117 instanceId = destInstId;
5118 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5119 {
5120 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5121 fixed = true;
5122 }
5123 }
5124 if (!fixed)
5125 {
5126 RelocateToHomebind();
5127 mapEntry = sMapStore.LookupEntry(mapId);
5128 }
5129 }
5130
5131 if (!mapEntry || !IsPositionValid())
5132 {
5133 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (MapId: {} X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5134 RelocateToHomebind();
5135 }
5136 // Player was saved in Arena or Bg
5137 else if (mapEntry->IsBattlegroundOrArena())
5138 {
5139 // xinef: resurrect player, cant log in dead without corpse
5140 {
5143 if (!IsAlive())
5144 ResurrectPlayer(1.0f);
5145 }
5146
5147 const WorldLocation& _loc = GetEntryPoint();
5148 mapId = _loc.GetMapId();
5149 instanceId = 0;
5150
5151 if (mapId == MAPID_INVALID)
5152 {
5153 RelocateToHomebind();
5154 }
5155 else
5156 {
5157 Relocate(&_loc);
5158
5159 // xinef: restore taxi flight from entry point data
5161 {
5165 }
5166 }
5167 }
5168 // currently we do not support transport in bg
5169 else if (transLowGUID != 0)
5170 {
5171 // transLowGUID > 0 ---> motion transport guid
5172 // transLowGUID < 0 ---> static transport spawn id
5173 Transport* transGO = nullptr;
5174 if (transLowGUID > 0)
5175 {
5176 ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID);
5177 transGO = HashMapHolder<MotionTransport>::Find(transGUID);
5178 }
5179 else
5180 {
5181 map = sMapMgr->CreateMap(mapId, this);
5182 if (map)
5183 {
5184 auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(std::abs(transLowGUID));
5185 if (bounds.first != bounds.second)
5186 transGO = bounds.first->second->ToTransport();
5187 }
5188 }
5189
5190 // pussywizard: must be on map, for one world tick transport is not in map and has old GetMapId(), player would be added to old map and to the transport, multithreading crashfix
5191 if (transGO && transGO->IsInWorld() && transGO->FindMap())
5192 m_transport = transGO;
5193
5194 if (m_transport)
5195 {
5196 float x = fields[31].Get<float>(), y = fields[32].Get<float>(), z = fields[33].Get<float>(), o = fields[34].Get<float>();
5200
5201 if (!Acore::IsValidMapCoord(x, y, z, o) || std::fabs(m_movementInfo.transport.pos.GetPositionX()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionY()) > 75.0f || std::fabs(m_movementInfo.transport.pos.GetPositionZ()) > 75.0f)
5202 {
5203 m_transport = nullptr;
5206 RelocateToHomebind();
5207 }
5208 else
5209 {
5210 Relocate(x, y, z, o);
5211 mapId = m_transport->GetMapId();
5214 }
5215 }
5216 else
5217 {
5218 bool fixed = false;
5219 if (mapEntry->Instanceable())
5220 if (AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId))
5221 {
5222 fixed = true;
5223 Relocate(at->target_X, at->target_Y, at->target_Z, at->target_Orientation);
5224 }
5225 if (!fixed)
5226 RelocateToHomebind();
5227 }
5228 }
5229 // currently we do not support taxi in instance
5230 else if (!taxi_nodes.empty())
5231 {
5232 instanceId = 0;
5233 if (!m_taxi.LoadTaxiDestinationsFromString(taxi_nodes, GetTeamId(true)))
5234 {
5235 // xinef: could no load valid data for taxi, relocate to homebind and clear
5237 RelocateToHomebind();
5238 }
5239 }
5240
5241 // Map could be changed before
5242 mapEntry = sMapStore.LookupEntry(mapId);
5243 // client without expansion support
5244 if (mapEntry)
5245 {
5246 if (GetSession()->Expansion() < mapEntry->Expansion())
5247 {
5248 LOG_DEBUG("entities.player.loading", "Player {} using client without required expansion tried login at non accessible map {}", GetName(), mapId);
5249 RelocateToHomebind();
5250 }
5251
5252 // check whether player was unbound or is bound to another instance
5253 if (instanceId)
5254 {
5255 InstanceSave* save = sInstanceSaveMgr->PlayerGetInstanceSave(GetGUID(), mapId, GetDifficulty(mapEntry->IsRaid()));
5256 if (!save || save->GetInstanceId() != instanceId)
5257 instanceId = 0;
5258 }
5259 }
5260
5261 // if the player is in an instance and it has been reset in the meantime teleport him to the entrance
5262 if ((instanceId && !sInstanceSaveMgr->GetInstanceSave(instanceId) && !mapEntry->IsBattlegroundOrArena()) || (!instanceId && mapEntry->IsDungeon()))
5263 {
5264 AreaTriggerTeleport const* at = sObjectMgr->GetMapEntranceTrigger(mapId);
5265 if (at)
5267 else
5268 RelocateToHomebind();
5269 }
5270
5271 // NOW player must have valid map
5272 // load the player's map here if it's not already loaded
5273 if (!map)
5274 map = sMapMgr->CreateMap(mapId, this);
5275
5276 if (!map)
5277 {
5278 instanceId = 0;
5279 AreaTriggerTeleport const* at = sObjectMgr->GetGoBackTrigger(mapId);
5280 if (at)
5281 {
5282 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to gobacktrigger (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5284 mapId = at->target_mapId;
5285 }
5286 else
5287 {
5288 LOG_ERROR("entities.player", "Player (guidlow {}) is teleported to home (Map: {} X: {} Y: {} Z: {} O: {}).", guid, mapId, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5289 RelocateToHomebind();
5290 }
5291
5292 map = sMapMgr->CreateMap(mapId, this);
5293 if (!map)
5294 {
5295 PlayerInfo const* info = sObjectMgr->GetPlayerInfo(getRace(true), getClass());
5296 mapId = info->mapId;
5297 Relocate(info->positionX, info->positionY, info->positionZ, 0.0f);
5298 LOG_ERROR("entities.player", "Player (guidlow {}) have invalid coordinates (X: {} Y: {} Z: {} O: {}). Teleport to default race/class locations.", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5299 map = sMapMgr->CreateMap(mapId, this);
5300 if (!map)
5301 {
5302 LOG_ERROR("entities.player", "Player (guidlow {}) has invalid default map coordinates (X: {} Y: {} Z: {} O: {}). or instance couldn't be created", guid, GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
5303 return false;
5304 }
5305 }
5306 }
5307
5308 SetMap(map);
5310
5312
5314
5315 time_t now = GameTime::GetGameTime().count();
5316 time_t logoutTime = time_t(fields[27].Get<uint32>());
5317
5318 // since last logout (in seconds)
5319 uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
5320
5321 // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
5322 // this must help in case next save after mass player load after server startup
5323 m_nextSave = urand(m_nextSave / 2, m_nextSave * 3 / 2);
5324
5325 // set value, including drunk invisibility detection
5326 // calculate sobering. after 15 minutes logged out, the player will be sober again
5327 uint8 newDrunkValue = 0;
5328 if (time_diff < uint32(GetDrunkValue()) * 9)
5329 newDrunkValue = GetDrunkValue() - time_diff / 9;
5330
5331 SetDrunkValue(newDrunkValue);
5332
5333 m_cinematic = fields[23].Get<uint8>();
5334 m_Played_time[PLAYED_TIME_TOTAL] = fields[24].Get<uint32>();
5335 m_Played_time[PLAYED_TIME_LEVEL] = fields[25].Get<uint32>();
5336
5337 m_resetTalentsCost = fields[29].Get<uint32>();
5338 m_resetTalentsTime = time_t(fields[30].Get<uint32>());
5339
5340 m_taxi.LoadTaxiMask(fields[22].Get<std::string_view>()); // must be before InitTaxiNodesForLevel
5341
5342 uint32 extraflags = fields[36].Get<uint16>();
5343
5344 _LoadPetStable(fields[37].Get<uint8>(), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS));
5345
5346 m_atLoginFlags = fields[38].Get<uint16>();
5347
5349 {
5350 LOG_ERROR("entities.player", "Player {} tried to login while forced to rename, can't load.'", GetGUID().ToString());
5351 return false;
5352 }
5353
5354 // Honor system
5355 // Update Honor kills data
5356 m_lastHonorUpdateTime = logoutTime;
5358
5359 m_deathExpireTime = time_t(fields[41].Get<uint32>());
5360
5363
5364 // clear channel spell data (if saved at channel spell casting)
5367
5368 // clear charm/summon related fields
5375
5377
5378 // reset some aura modifiers before aura apply
5381
5382 // make sure the unit is considered not in duel for proper loading
5385
5386 // reset stats before loading any modifiers
5390 InitRunes();
5391
5392 sScriptMgr->OnPlayerLoadFromDB(this);
5393
5394 // make sure the unit is considered out of combat for proper loading
5395 ClearInCombat();
5396
5397 // rest bonus can only be calculated after InitStatsForLevel()
5398 _restBonus = fields[26].Get<float>();
5399
5400 if (time_diff > 0)
5401 {
5402 //speed collect rest bonus in offline, in logout, far from tavern, city (section/in hour)
5403 float bubble0 = 0.031f;
5404 //speed collect rest bonus in offline, in logout, in tavern, city (section/in hour)
5405 float bubble1 = 0.125f;
5406 float bubble = fields[28].Get<uint8>() > 0
5407 ? bubble1 * sWorld->getRate(RATE_REST_OFFLINE_IN_TAVERN_OR_CITY)
5408 : bubble0 * sWorld->getRate(RATE_REST_OFFLINE_IN_WILDERNESS);
5409
5410 // Client automatically doubles the value sent so we have to divide it by 2
5411 SetRestBonus(GetRestBonus() + time_diff * ((float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 144000)*bubble);
5412 }
5413
5414 uint32 innTriggerId = fields[72].Get<uint32>();
5415 if (innTriggerId)
5416 {
5417 SetRestFlag(REST_FLAG_IN_TAVERN, innTriggerId);
5418 }
5419
5420 // load skills after InitStatsForLevel because it triggering aura apply also
5421 _LoadSkills(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SKILLS));
5422 UpdateSkillsForLevel(); //update skills after load, to make sure they are correctly update at player load
5423
5424 // apply original stats mods before spell loading or item equipment that call before equip _RemoveStatsMods()
5425
5426 m_specsCount = fields[64].Get<uint8>();
5427 m_activeSpec = fields[65].Get<uint8>();
5428
5431
5432 _LoadSpells(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
5433 _LoadTalents(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_TALENTS));
5434
5435 _LoadGlyphs(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
5437 _LoadAuras(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
5438 // add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
5440 {
5443 }
5444
5445 // pussywizard: remove auras that are removed at map change (after _LoadAuras)
5447
5448 // after spell load, learn rewarded spell if need also
5449 _LoadQuestStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS));
5455 _LoadRandomBGStatus(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG));
5456
5457 // Extra Bonus Talent Points
5458 m_extraBonusTalentCount = fields[73].Get<uint8>();
5459
5460 // after spell, bonus talents, and quest load
5462
5463 // must be before inventory (some items required reputation check)
5465
5466 // xinef: load mails before inventory, so problematic items can be added to already loaded mails
5467 _LoadMail(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
5468
5469 _LoadInventory(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_INVENTORY), time_diff);
5470
5471 // update items with duration and realtime
5472 UpdateItemDuration(time_diff, true);
5473
5474 _LoadActions(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
5475
5476 m_social = sSocialMgr->LoadFromDB(holder.GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
5477
5478 // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
5479 // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
5480 uint32 curTitle = fields[51].Get<uint32>();
5481 if (curTitle && !HasTitle(curTitle))
5482 curTitle = 0;
5483
5485
5486 // has to be called after last Relocate() in Player::LoadFromDB
5488
5490
5491 // Spell code allow apply any auras to dead character in load time in aura/spell/item loading
5492 // Do now before stats re-calculation cleanup for ghost state unexpected auras
5493 if (!IsAlive())
5495 else
5497
5498 //apply all stat bonuses from items and auras
5499 SetCanModifyStats(true);
5501
5502 // restore remembered power/health values (but not more max values)
5503 uint32 savedHealth = fields[55].Get<uint32>();
5504 SetHealth(savedHealth > GetMaxHealth() ? GetMaxHealth() : savedHealth);
5505 for (uint8 i = 0; i < MAX_POWERS; ++i)
5506 {
5507 uint32 savedPower = fields[56 + i].Get<uint32>();
5508 SetPower(Powers(i), savedPower > GetMaxPower(Powers(i)) ? GetMaxPower(Powers(i)) : savedPower);
5509 }
5510
5511 LOG_DEBUG("entities.player.loading", "The value of player {} after load item and aura is: ", m_name);
5513
5514 // GM state
5516 {
5517 switch (sWorld->getIntConfig(CONFIG_GM_LOGIN_STATE))
5518 {
5519 default:
5520 case 0:
5521 break; // disable
5522 case 1:
5523 SetGameMaster(true);
5524 break; // enable
5525 case 2: // save state
5526 if (extraflags & PLAYER_EXTRA_GM_ON)
5527 SetGameMaster(true);
5528 break;
5529 }
5530
5531 switch (sWorld->getIntConfig(CONFIG_GM_VISIBLE_STATE))
5532 {
5533 default:
5534 case 0:
5535 SetGMVisible(false);
5536 break; // invisible
5537 case 1:
5538 break; // visible
5539 case 2: // save state
5540 if (extraflags & PLAYER_EXTRA_GM_INVISIBLE)
5541 SetGMVisible(false);
5542 break;
5543 }
5544
5545 switch (sWorld->getIntConfig(CONFIG_GM_CHAT))
5546 {
5547 default:
5548 case 0:
5549 break; // disable
5550 case 1:
5551 SetGMChat(true);
5552 break; // enable
5553 case 2: // save state
5554 if (extraflags & PLAYER_EXTRA_GM_CHAT)
5555 SetGMChat(true);
5556 break;
5557 }
5558
5559 switch (sWorld->getIntConfig(CONFIG_GM_WHISPERING_TO))
5560 {
5561 default:
5562 case 0:
5563 break; // disable
5564 case 1:
5565 SetAcceptWhispers(true);
5566 break; // enable
5567 case 2: // save state
5568 if (extraflags & PLAYER_EXTRA_ACCEPT_WHISPERS)
5569 SetAcceptWhispers(true);
5570 break;
5571 }
5572 }
5573
5574 // RaF stuff.
5575 m_grantableLevels = fields[71].Get<uint8>();
5576 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
5578
5579 if (m_grantableLevels > 0)
5581
5583
5584 //m_achievementMgr->CheckAllAchievementCriteria(); // pussywizard: disabled this
5585
5587
5589
5591
5592 // Players are immune to taunt
5595
5596 // Init charm info
5598
5599 // Fix aurastate auras, depending on health!
5600 // Set aurastate manualy, prevents aura switching
5601 if (HealthBelowPct(20))
5603 if (HealthBelowPct(35))
5605 if (HealthAbovePct(75))
5607
5608 // unapply aura stats if dont meet requirements
5609 AuraApplicationMap const& Auras = GetAppliedAuras();
5610 for (AuraApplicationMap::const_iterator itr = Auras.begin(); itr != Auras.end(); ++itr)
5611 {
5612 // we assume that all auras are applied now, aurastate was modfied MANUALY preventing any apply/unapply state switching
5613 Aura* aura = itr->second->GetBase();
5614 SpellInfo const* m_spellInfo = aura->GetSpellInfo();
5618 continue;
5619
5620 if (!HasAuraState((AuraStateType)m_spellInfo->CasterAuraState))
5621 aura->HandleAllEffects(itr->second, AURA_EFFECT_HANDLE_REAL, false);
5622 }
5623 return true;
5624}
@ CHAR_UPD_ADD_AT_LOGIN_FLAG
Definition CharacterDatabase.h:276
#define MAX_RAID_DIFFICULTY
Definition DBCEnums.h:282
#define MAX_DUNGEON_DIFFICULTY
Definition DBCEnums.h:281
@ REST_FLAG_IN_TAVERN
Definition Player.h:809
@ PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS
Definition Player.h:871
@ PLAYER_LOGIN_QUERY_LOAD_GLYPHS
Definition Player.h:877
@ PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES
Definition Player.h:872
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW
Definition Player.h:884
@ PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS
Definition Player.h:863
@ PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS
Definition Player.h:890
@ PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES
Definition Player.h:885
@ PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS
Definition Player.h:886
@ PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST
Definition Player.h:869
@ PLAYER_LOGIN_QUERY_LOAD_ACTIONS
Definition Player.h:866
@ PLAYER_LOGIN_QUERY_LOAD_SKILLS
Definition Player.h:880
@ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS
Definition Player.h:868
@ PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS
Definition Player.h:891
@ PLAYER_LOGIN_QUERY_LOAD_INVENTORY
Definition Player.h:865
@ PLAYER_LOGIN_QUERY_LOAD_REPUTATION
Definition Player.h:864
@ PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH
Definition Player.h:888
@ PLAYER_LOGIN_QUERY_LOAD_FROM
Definition Player.h:859
@ PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS
Definition Player.h:862
@ PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT
Definition Player.h:876
@ PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES
Definition Player.h:892
@ PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS
Definition Player.h:881
@ PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS
Definition Player.h:887
@ PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS
Definition Player.h:875
@ PLAYER_LOGIN_QUERY_LOAD_MAILS
Definition Player.h:867
@ PLAYER_LOGIN_QUERY_LOAD_AURAS
Definition Player.h:860
@ PLAYER_LOGIN_QUERY_LOAD_TALENTS
Definition Player.h:878
@ PLAYER_LOGIN_QUERY_LOAD_BANNED
Definition Player.h:883
@ PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS
Definition Player.h:874
@ PLAYER_LOGIN_QUERY_LOAD_HOME_BIND
Definition Player.h:870
@ PLAYER_LOGIN_QUERY_LOAD_SPELLS
Definition Player.h:861
@ PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG
Definition Player.h:882
@ PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS
Definition Player.h:873
@ SPELL_EFFECT_ATTACK_ME
Definition SharedDefines.h:903
@ CHAR_NAME_SUCCESS
Definition SharedDefines.h:3685
@ UNIT_DYNFLAG_REFER_A_FRIEND
Definition SharedDefines.h:3377
@ IMMUNITY_STATE
Definition SharedDefines.h:1406
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1405
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74
@ AURA_INTERRUPT_FLAG_CHANGE_MAP
Definition SpellDefines.h:62
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:378
@ UNIT_FLAG2_FORCE_MOVEMENT
Definition UnitDefines.h:299
@ UNIT_STATE_ISOLATED
Definition UnitDefines.h:183
@ UNIT_FIELD_CHANNEL_OBJECT
Definition UpdateFields.h:93
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87
@ UNIT_FIELD_CHARMEDBY
Definition UpdateFields.h:89
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
@ PLAYER_TRACK_CREATURES
Definition UpdateFields.h:344
@ PLAYER_TRACK_RESOURCES
Definition UpdateFields.h:345
@ UNIT_CHANNEL_SPELL
Definition UpdateFields.h:94
@ CONFIG_GM_CHAT
Definition WorldConfig.h:209
@ CONFIG_GM_WHISPERING_TO
Definition WorldConfig.h:210
@ RATE_REST_OFFLINE_IN_WILDERNESS
Definition WorldConfig.h:464
@ RATE_REST_OFFLINE_IN_TAVERN_OR_CITY
Definition WorldConfig.h:463
@ CONFIG_GM_LOGIN_STATE
Definition WorldConfig.h:207
@ CONFIG_GM_VISIBLE_STATE
Definition WorldConfig.h:208
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult, PreparedQueryResult offlineUpdatesResult)
Definition AchievementMgr.cpp:618
Transport * ToTransport()
Definition GameObject.h:320
static T * Find(ObjectGuid guid)
Definition ObjectAccessor.cpp:53
uint32 GetInstanceId() const
Definition InstanceSaveMgr.h:61
GameObjectBySpawnIdContainer & GetGameObjectBySpawnIdStore()
Definition Map.h:354
static uint8 CheckPlayerName(std::string_view name, bool create=false)
Definition ObjectMgr.cpp:8652
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition Object.cpp:601
bool LoadTaxiMask(std::string_view data)
Definition PlayerTaxi.cpp:89
bool LoadTaxiDestinationsFromString(std::string const &values, TeamId teamId)
Definition PlayerTaxi.cpp:130
void _LoadDeclinedNames(PreparedQueryResult result)
Definition PlayerStorage.cpp:4791
void _LoadGlyphs(PreparedQueryResult result)
Definition Player.cpp:15075
void SetRestFlag(RestFlag restFlag, uint32 triggerId=0)
Definition Player.cpp:16165
void SetCreationTime(Seconds creationTime)
Definition Player.h:2542
void SetGameMaster(bool on)
Definition Player.cpp:2204
void _LoadQuestStatusRewarded(PreparedQueryResult result)
Definition PlayerStorage.cpp:6321
void _LoadAuras(PreparedQueryResult result, uint32 timediff)
Definition PlayerStorage.cpp:5706
void _LoadSeasonalQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6429
void _LoadGroup()
Definition PlayerStorage.cpp:6494
void _LoadCharacterSettings(PreparedQueryResult result)
Definition PlayerSettings.cpp:110
void _LoadTalents(PreparedQueryResult result)
Definition Player.cpp:15124
void SetFallInformation(uint32 time, float z)
Definition Player.h:2340
void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result)
Definition Player.cpp:15936
void _LoadBrewOfTheMonth(PreparedQueryResult result)
Definition Player.cpp:15899
WorldLocation const & GetEntryPoint() const
Definition Player.h:2382
void outDebugValues() const
Definition PlayerStorage.cpp:7795
void _LoadRandomBGStatus(PreparedQueryResult result)
Definition Player.cpp:15834
void SaveRecallPosition()
Definition Player.cpp:5679
void _LoadQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6234
void _LoadMonthlyQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6452
void SetGMChat(bool on)
Definition Player.h:1164
void _LoadArenaTeamInfo()
Definition PlayerStorage.cpp:4802
bool _LoadHomeBind(PreparedQueryResult result)
Definition PlayerStorage.cpp:7001
void UpdateItemDuration(uint32 time, bool realtimeonly=false)
Definition PlayerStorage.cpp:4144
void _LoadSpells(PreparedQueryResult result)
Definition PlayerStorage.cpp:6474
void _LoadSkills(PreparedQueryResult result)
Definition Player.cpp:13719
void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
Definition PlayerStorage.cpp:6161
void _LoadWeeklyQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6407
void SetGMVisible(bool on)
Definition Player.cpp:2273
void PrepareCharmAISpells()
Definition Player.cpp:15530
void _LoadGlyphAuras()
Definition PlayerStorage.cpp:5789
void ReplaceAllPlayerFlags(PlayerFlags flags)
Definition Player.h:1113
void _LoadEquipmentSets(PreparedQueryResult result)
Definition PlayerStorage.cpp:4833
void _LoadEntryPointData(PreparedQueryResult result)
Definition PlayerStorage.cpp:4864
void _LoadInstanceTimeRestrictions(PreparedQueryResult result)
Definition Player.cpp:15887
void StoreRaidMapDifficulty()
Definition Player.h:1921
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff)
Definition PlayerStorage.cpp:5841
void UpdateHonorFields()
Definition PlayerUpdates.cpp:1182
void _LoadSpellCooldowns(PreparedQueryResult result)
Definition Player.cpp:3599
void SetMoney(uint32 value)
Definition Player.h:1613
void _LoadDailyQuestStatus(PreparedQueryResult result)
Definition PlayerStorage.cpp:6356
void LoadFromDB(PreparedQueryResult result)
Definition ReputationMgr.cpp:564
uint32 CasterAuraState
Definition SpellInfo.h:339
virtual void AddPassenger(WorldObject *passenger, bool withAll=false)=0
void CalculatePassengerPosition(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied transport offsets into global coordinates.
Definition Transport.h:33
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1080
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13468
void RemoveAllAurasRequiringDeadTarget()
Definition Unit.cpp:5440
DeathState m_deathState
Definition Unit.h:2110
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5417
void AddUnitState(uint32 f)
Definition Unit.h:720
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1078
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:757
void RemoveUnitFlag2(UnitFlags2 flags)
Definition Unit.h:740
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10649
void ClearInCombat()
Definition Unit.cpp:13897
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:701
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1759
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5249
Transport * m_transport
Definition Object.h:748
void SetPlayer(Player *player)
Definition WorldSession.cpp:1308
bool IsARecruiter() const
Definition WorldSession.h:589
bool IsValidMapCoord(float c)
Definition GridDefines.h:210
Definition ObjectMgr.h:411
float target_Z
Definition ObjectMgr.h:415
float target_X
Definition ObjectMgr.h:413
float target_Orientation
Definition ObjectMgr.h:416
float target_Y
Definition ObjectMgr.h:414
uint32 target_mapId
Definition ObjectMgr.h:412
void ClearTaxiPath()
Definition Player.h:1054
bool HasTaxiPath() const
Definition Player.h:1055
bool IsNonRaidDungeon() const
Definition DBCStructure.h:1353
uint32 Expansion() const
Definition DBCStructure.h:1350
bool IsBattlegroundOrArena() const
Definition DBCStructure.h:1358
bool IsDungeon() const
Definition DBCStructure.h:1352
bool IsRaid() const
Definition DBCStructure.h:1355
bool Instanceable() const
Definition DBCStructure.h:1354
void Reset()
Definition Object.h:299
ObjectGuid guid
Definition Object.h:308
Position pos
Definition Object.h:309
void RemoveMovementFlag(uint32 flag)
Definition Object.h:345
struct MovementInfo::TransportInfo transport
bool IsPositionValid() const
Definition Position.cpp:183

References Object::_Create(), _LoadActions(), _LoadArenaTeamInfo(), _LoadAuras(), _LoadBrewOfTheMonth(), _LoadCharacterSettings(), _LoadDailyQuestStatus(), _LoadDeclinedNames(), _LoadEntryPointData(), _LoadEquipmentSets(), _LoadGlyphAuras(), _LoadGlyphs(), _LoadGroup(), _LoadHomeBind(), _LoadInstanceTimeRestrictions(), Object::_LoadIntoDataField(), _LoadInventory(), _LoadMail(), _LoadMonthlyQuestStatus(), _LoadPetStable(), _LoadQuestStatus(), _LoadQuestStatusRewarded(), _LoadRandomBGStatus(), _LoadSeasonalQuestStatus(), _LoadSkills(), _LoadSpellCooldowns(), _LoadSpells(), _LoadTalents(), _LoadWeeklyQuestStatus(), _restBonus, Transport::AddPassenger(), PlayerTaxi::AddTaxiDestination(), Unit::AddUnitMovementFlag(), Unit::AddUnitState(), Unit::ApplySpellImmune(), AT_LOGIN_RENAME, AURA_EFFECT_HANDLE_REAL, AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, Transport::CalculatePassengerPosition(), SpellInfo::CasterAuraState, CHAR_NAME_SUCCESS, CHAR_UPD_ADD_AT_LOGIN_FLAG, CharacterDatabase, ObjectMgr::CheckPlayerName(), Unit::ClearInCombat(), PlayerTaxi::ClearTaxiDestinations(), EntryPointData::ClearTaxiPath(), CONFIG_GM_CHAT, CONFIG_GM_LOGIN_STATE, CONFIG_GM_VISIBLE_STATE, CONFIG_GM_WHISPERING_TO, Dead, DEATH_EXPIRE_STEP, DUNGEON_DIFFICULTY_NORMAL, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, MapEntry::Expansion(), HashMapHolder< T >::Find(), WorldObject::FindMap(), Field::Get(), WorldSession::GetAccountId(), Unit::GetAppliedAuras(), Unit::getClass(), ObjectGuid::GetCounter(), GetDifficulty(), GetDrunkValue(), GetDungeonDifficulty(), GetEntryPoint(), Map::GetGameObjectBySpawnIdStore(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), InstanceSave::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMaxHealth(), Unit::GetMaxPower(), WorldObject::GetName(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), SQLQueryHolderBase::GetPreparedResult(), Unit::getRace(), GetRaidDifficulty(), WorldSession::GetRecruiterId(), GetRestBonus(), GetSession(), Aura::GetSpellInfo(), GetTeamId(), Object::GetUInt32Value(), MovementInfo::TransportInfo::guid, Aura::HandleAllEffects(), HasAtLoginFlag(), Unit::HasAuraState(), HasPlayerFlag(), Unit::HasSpiritOfRedemptionAura(), EntryPointData::HasTaxiPath(), HasTitle(), Unit::HealthAbovePct(), Unit::HealthBelowPct(), IMMUNITY_EFFECT, IMMUNITY_STATE, InitDisplayIds(), InitGlyphsForLevel(), InitPrimaryProfessions(), InitRunes(), InitStatsForLevel(), InitTalentForLevel(), InitTaxiNodesForLevel(), MapEntry::Instanceable(), Unit::IsAlive(), WorldSession::IsARecruiter(), MapEntry::IsBattlegroundOrArena(), MapEntry::IsDungeon(), Object::IsInWorld(), MapEntry::IsNonRaidDungeon(), AccountMgr::IsPlayerAccount(), Position::IsPositionValid(), MapEntry::IsRaid(), IsValidGender(), Acore::IsValidMapCoord(), KNOWN_TITLES_SIZE, LearnCustomSpells(), LearnDefaultSkills(), AchievementMgr::LoadFromDB(), ReputationMgr::LoadFromDB(), PlayerTaxi::LoadTaxiDestinationsFromString(), PlayerTaxi::LoadTaxiMask(), LOG_DEBUG, LOG_ERROR, LOG_WARN, m_achievementMgr, m_activeSpec, m_atLoginFlags, m_cinematic, m_deathExpireTime, Unit::m_deathState, m_entryPointData, m_extraBonusTalentCount, m_grantableLevels, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_items, m_lastHonorUpdateTime, WorldObject::m_movementInfo, WorldObject::m_name, m_nextSave, m_Played_time, Unit::m_race, Unit::m_realRace, m_reputationMgr, m_resetTalentsCost, m_resetTalentsTime, m_social, m_specsCount, m_taxi, WorldObject::m_transport, PlayerInfo::mapId, MAPID_INVALID, MAX_DEATH_COUNT, MAX_DUNGEON_DIFFICULTY, MAX_MONEY_AMOUNT, MAX_POWERS, MAX_RAID_DIFFICULTY, MOVEMENTFLAG_ONTRANSPORT, outDebugValues(), PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, Player, PLAYER__FIELD_KNOWN_TITLES, PLAYER_AMMO_ID, PLAYER_BYTES, PLAYER_BYTES_2, PLAYER_BYTES_3, PLAYER_CHOSEN_TITLE, PLAYER_DUEL_ARBITER, PLAYER_DUEL_TEAM, PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE, PLAYER_EXTRA_ACCEPT_WHISPERS, PLAYER_EXTRA_GM_CHAT, PLAYER_EXTRA_GM_INVISIBLE, PLAYER_EXTRA_GM_ON, PLAYER_FARSIGHT, PLAYER_FIELD_BYTES, PLAYER_FIELD_INV_SLOT_HEAD, PLAYER_FIELD_KILLS, PLAYER_FIELD_KNOWN_CURRENCIES, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_WATCHED_FACTION_INDEX, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, PLAYER_FLAGS_GHOST, PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS, PLAYER_LOGIN_QUERY_LOAD_ACTIONS, PLAYER_LOGIN_QUERY_LOAD_AURAS, PLAYER_LOGIN_QUERY_LOAD_BANNED, PLAYER_LOGIN_QUERY_LOAD_BREW_OF_THE_MONTH, PLAYER_LOGIN_QUERY_LOAD_CHARACTER_SETTINGS, PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS, PLAYER_LOGIN_QUERY_LOAD_DAILY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_DECLINED_NAMES, PLAYER_LOGIN_QUERY_LOAD_ENTRY_POINT, PLAYER_LOGIN_QUERY_LOAD_EQUIPMENT_SETS, PLAYER_LOGIN_QUERY_LOAD_FROM, PLAYER_LOGIN_QUERY_LOAD_GLYPHS, PLAYER_LOGIN_QUERY_LOAD_HOME_BIND, PLAYER_LOGIN_QUERY_LOAD_INSTANCE_LOCK_TIMES, PLAYER_LOGIN_QUERY_LOAD_INVENTORY, PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, PLAYER_LOGIN_QUERY_LOAD_MAILS, PLAYER_LOGIN_QUERY_LOAD_MONTHLY_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_OFFLINE_ACHIEVEMENTS_UPDATES, PLAYER_LOGIN_QUERY_LOAD_PET_SLOTS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_REW, PLAYER_LOGIN_QUERY_LOAD_RANDOM_BG, PLAYER_LOGIN_QUERY_LOAD_REPUTATION, PLAYER_LOGIN_QUERY_LOAD_SEASONAL_QUEST_STATUS, PLAYER_LOGIN_QUERY_LOAD_SKILLS, PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST, PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS, PLAYER_LOGIN_QUERY_LOAD_SPELLS, PLAYER_LOGIN_QUERY_LOAD_TALENTS, PLAYER_LOGIN_QUERY_LOAD_WEEKLY_QUEST_STATUS, PLAYER_NEXT_LEVEL_XP, PLAYER_TRACK_CREATURES, PLAYER_TRACK_RESOURCES, PLAYER_XP, MovementInfo::TransportInfo::pos, PlayerInfo::positionX, PlayerInfo::positionY, PlayerInfo::positionZ, PrepareCharmAISpells(), RAID_DIFFICULTY_10MAN_NORMAL, RATE_REST_OFFLINE_IN_TAVERN_OR_CITY, RATE_REST_OFFLINE_IN_WILDERNESS, Position::Relocate(), Unit::RemoveAllAurasOnDeath(), Unit::RemoveAllAurasRequiringDeadTarget(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Unit::RemoveUnitFlag2(), ReplaceAllPlayerFlags(), MovementInfo::TransportInfo::Reset(), REST_FLAG_IN_TAVERN, ResurrectPlayer(), SaveRecallPosition(), SetAcceptWhispers(), SetArenaPoints(), Object::SetByteValue(), Unit::SetCanModifyStats(), SetCreationTime(), Unit::SetCreatorGUID(), PreparedStatementBase::SetData(), SetDrunkValue(), SetDungeonDifficulty(), Object::SetDynamicFlag(), SetFactionForRace(), SetFallInformation(), Object::SetFlag(), Object::SetFloatValue(), SetGameMaster(), SetGMChat(), SetGMVisible(), Object::SetGuidValue(), Unit::SetHealth(), SetHonorPoints(), Object::SetInt32Value(), SetMap(), SetMoney(), SetObjectScale(), Unit::SetOwnerGUID(), WorldSession::SetPlayer(), Unit::SetPower(), SetRaidDifficulty(), SetRestBonus(), SetRestFlag(), Object::SetUInt16Value(), Unit::SetUInt32Value(), Object::SetUInt64Value(), SetVisibleItemSlot(), sInstanceSaveMgr, sMapMgr, sMapStore, sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOD_TAUNT, SPELL_EFFECT_ATTACK_ME, sScriptMgr, sSocialMgr, StoreRaidMapDifficulty(), sWorld, AreaTriggerTeleport::target_mapId, AreaTriggerTeleport::target_Orientation, AreaTriggerTeleport::target_X, AreaTriggerTeleport::target_Y, AreaTriggerTeleport::target_Z, EntryPointData::taxiPath, ObjectGuid::ToString(), Position::ToString(), GameObject::ToTransport(), MovementInfo::transport, UNIT_CHANNEL_SPELL, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_AURASTATE, UNIT_FIELD_BYTES_0, UNIT_FIELD_CHANNEL_OBJECT, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FIELD_HOVERHEIGHT, UNIT_FIELD_LEVEL, UNIT_FIELD_SUMMON, UNIT_FLAG2_FORCE_MOVEMENT, UNIT_STATE_ISOLATED, UpdateAllStats(), UpdateHonorFields(), UpdateItemDuration(), WorldObject::UpdatePositionData(), UpdateSkillsForLevel(), and urand().

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPet()

void Player::LoadPet ( )
6223{
6224 //fixme: the pet should still be loaded if the player is not in world
6225 // just not added to the map
6226 if (m_petStable && IsInWorld())
6227 {
6228 Pet* pet = new Pet(this);
6229 if (!pet->LoadPetFromDB(this, 0, 0, true))
6230 delete pet;
6231 }
6232}
bool LoadPetFromDB(Player *owner, uint32 petEntry, uint32 petnumber, bool current, uint32 healthPct=0, bool fullMana=false)
Definition Pet.cpp:216

References Object::IsInWorld(), Pet::LoadPetFromDB(), and m_petStable.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ LoadPositionFromDB()

bool Player::LoadPositionFromDB ( uint32 mapid,
float &  x,
float &  y,
float &  z,
float &  o,
bool &  in_flight,
ObjectGuid::LowType  guid 
)
static
4882{
4884 stmt->SetData(0, guid);
4885 PreparedQueryResult result = CharacterDatabase.Query(stmt);
4886
4887 if (!result)
4888 return false;
4889
4890 Field* fields = result->Fetch();
4891
4892 x = fields[0].Get<float>();
4893 y = fields[1].Get<float>();
4894 z = fields[2].Get<float>();
4895 o = fields[3].Get<float>();
4896 mapid = fields[4].Get<uint16>();
4897 in_flight = !fields[5].Get<std::string>().empty();
4898
4899 return true;
4900}
@ CHAR_SEL_CHAR_POSITION
Definition CharacterDatabase.h:54

References CHAR_SEL_CHAR_POSITION, CharacterDatabase, Field::Get(), and PreparedStatementBase::SetData().

Referenced by misc_commandscript::HandleAppearCommand().

◆ ModifyArenaPoints()

void Player::ModifyArenaPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)

If trans is specified, honor save query will be added to trans.

6314{
6315 int32 newValue = int32(GetArenaPoints()) + value;
6316 if (newValue < 0)
6317 newValue = 0;
6318 SetArenaPoints(uint32(newValue));
6319
6320 if (trans)
6321 {
6323 stmt->SetData(0, newValue);
6324 stmt->SetData(1, GetGUID().GetCounter());
6325 trans->Append(stmt);
6326 }
6327}
@ CHAR_UDP_CHAR_ARENA_POINTS
Definition CharacterDatabase.h:427

References CHAR_UDP_CHAR_ARENA_POINTS, CharacterDatabase, GetArenaPoints(), Object::GetGUID(), SetArenaPoints(), and PreparedStatementBase::SetData().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyArenaCommand(), RefundItem(), and RewardQuest().

◆ ModifyHonorPoints()

void Player::ModifyHonorPoints ( int32  value,
CharacterDatabaseTransaction  trans = CharacterDatabaseTransaction(nullptr) 
)
6298{
6299 int32 newValue = int32(GetHonorPoints()) + value;
6300 if (newValue < 0)
6301 newValue = 0;
6302 SetHonorPoints(uint32(newValue));
6303
6304 if (trans)
6305 {
6307 stmt->SetData(0, newValue);
6308 stmt->SetData(1, GetGUID().GetCounter());
6309 trans->Append(stmt);
6310 }
6311}
@ CHAR_UDP_CHAR_HONOR_POINTS
Definition CharacterDatabase.h:425

References CHAR_UDP_CHAR_HONOR_POINTS, CharacterDatabase, Object::GetGUID(), GetHonorPoints(), PreparedStatementBase::SetData(), and SetHonorPoints().

Referenced by _StoreOrEquipNewItem(), modify_commandscript::HandleModifyHonorCommand(), RefundItem(), and RewardHonor().

◆ ModifyMoney()

bool Player::ModifyMoney ( int32  amount,
bool  sendError = true 
)
11526{
11527 if (!amount)
11528 return true;
11529
11530 sScriptMgr->OnPlayerMoneyChanged(this, amount);
11531
11532 if (amount < 0)
11533 SetMoney (GetMoney() > uint32(-amount) ? GetMoney() + amount : 0);
11534 else
11535 {
11536 if (GetMoney() < uint32(MAX_MONEY_AMOUNT - amount))
11537 SetMoney(GetMoney() + amount);
11538 else
11539 {
11540 if (sendError)
11541 SendEquipError(EQUIP_ERR_TOO_MUCH_GOLD, nullptr, nullptr);
11542 return false;
11543 }
11544 }
11545
11546 return true;
11547}
@ EQUIP_ERR_TOO_MUCH_GOLD
Definition Item.h:123

References EQUIP_ERR_TOO_MUCH_GOLD, GetMoney(), MAX_MONEY_AMOUNT, SendEquipError(), SetMoney(), and sScriptMgr.

Referenced by _StoreOrEquipNewItem(), ActivateTaxiPathTo(), FlightPathMovementGenerator::DoUpdate(), DurabilityRepair(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyBankSlotOpcode(), Guild::HandleBuyBankTab(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), modify_commandscript::HandleModifyMoneyCommand(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), Guild::HandleSetEmblem(), WorldSession::HandleTrainerBuySpellOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), ProcessCastaction(), ProcessUnlearnAction(), RefundItem(), resetTalents(), RewardQuest(), and SetHonorPoints().

◆ ModifySkillBonus()

void Player::ModifySkillBonus ( uint32  skillid,
int32  val,
bool  talent 
)
5329{
5330 SkillStatusMap::const_iterator itr = mSkillStatus.find(skillid);
5331 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
5332 return;
5333
5334 uint32 bonusIndex = PLAYER_SKILL_BONUS_INDEX(itr->second.pos);
5335
5336 uint32 bonus_val = GetUInt32Value(bonusIndex);
5337 int16 temp_bonus = SKILL_TEMP_BONUS(bonus_val);
5338 int16 perm_bonus = SKILL_PERM_BONUS(bonus_val);
5339
5340 if (talent) // permanent bonus stored in high part
5341 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus, perm_bonus + val));
5342 else // temporary/item bonus stored in low part
5343 SetUInt32Value(bonusIndex, MAKE_SKILL_BONUS(temp_bonus + val, perm_bonus));
5344}
#define MAKE_SKILL_BONUS(t, p)
Definition Player.h:89

References Object::GetUInt32Value(), MAKE_SKILL_BONUS, mSkillStatus, PLAYER_SKILL_BONUS_INDEX, Unit::SetUInt32Value(), SKILL_DELETED, SKILL_PERM_BONUS, and SKILL_TEMP_BONUS.

Referenced by AuraEffect::HandleAuraModSkill().

◆ ModifySpellCooldown()

void Player::ModifySpellCooldown ( uint32  spellId,
int32  cooldown 
)
11113{
11114 SpellCooldowns::iterator itr = m_spellCooldowns.find(spellId);
11115 if (itr == m_spellCooldowns.end())
11116 return;
11117
11118 itr->second.end += cooldown;
11119
11120 WorldPacket data(SMSG_MODIFY_COOLDOWN, 4 + 8 + 4);
11121 data << uint32(spellId); // Spell ID
11122 data << GetGUID(); // Player GUID
11123 data << int32(cooldown); // Cooldown mod in milliseconds
11124 SendDirectMessage(&data);
11125}
@ SMSG_MODIFY_COOLDOWN
Definition Opcodes.h:1199

References Object::GetGUID(), m_spellCooldowns, SendDirectMessage(), and SMSG_MODIFY_COOLDOWN.

◆ MoneyChanged()

void Player::MoneyChanged ( uint32  value)
2172{
2173 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2174 {
2175 uint32 questid = GetQuestSlotQuestId(i);
2176 if (!questid)
2177 continue;
2178
2179 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2180 {
2181 int32 rewOrReqMoney = qInfo->GetRewOrReqMoney();
2182 if (rewOrReqMoney < 0)
2183 {
2184 QuestStatusData& q_status = m_QuestStatus[questid];
2185
2186 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2187 {
2188 if (int32(count) >= -rewOrReqMoney)
2189 {
2190 if (CanCompleteQuest(questid))
2191 {
2192 CompleteQuest(questid);
2193 }
2194 }
2195 }
2196 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2197 {
2198 if (int32(count) < -rewOrReqMoney)
2199 {
2200 IncompleteQuest(questid);
2201 }
2202 }
2203 }
2204 }
2205 }
2206}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by SetMoney().

◆ MoveItemFromInventory()

void Player::MoveItemFromInventory ( uint8  bag,
uint8  slot,
bool  update 
)
2980{
2981 if (Item* it = GetItemByPos(bag, slot))
2982 {
2983 ItemRemovedQuestCheck(it->GetEntry(), it->GetCount());
2984 RemoveItem(bag, slot, update);
2986 it->SetNotRefundable(this, false);
2987 it->RemoveFromUpdateQueueOf(this);
2988 if (it->IsInWorld())
2989 {
2990 it->RemoveFromWorld();
2991 it->DestroyForPlayer(this);
2992 }
2993
2994 sScriptMgr->OnPlayerAfterMoveItemFromInventory(this, it, bag, slot, update);
2995 }
2996}

References GetItemByPos(), ItemRemovedQuestCheck(), RemoveItem(), sScriptMgr, and UpdateTitansGrip().

Referenced by AutoUnequipOffhandIfNeed(), WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionSellItem(), and WorldSession::HandleSendMail().

◆ MoveItemToInventory()

void Player::MoveItemToInventory ( ItemPosCountVec const &  dest,
Item pItem,
bool  update,
bool  in_characterInventoryDB = false 
)
3000{
3001 // update quest counters
3002 ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
3004
3005 // store item
3006 Item* pLastItem = StoreItem(dest, pItem, update);
3007
3008 // only set if not merged to existed stack (pItem can be deleted already but we can compare pointers any way)
3009 if (pLastItem == pItem)
3010 {
3011 // update owner for last item (this can be original item with wrong owner
3012 if (pLastItem->GetOwnerGUID() != GetGUID())
3013 pLastItem->SetOwnerGUID(GetGUID());
3014
3015 // if this original item then it need create record in inventory
3016 // in case trade we already have item in other player inventory
3017 pLastItem->SetState(in_characterInventoryDB ? ITEM_CHANGED : ITEM_NEW, this);
3018
3019 if (pLastItem->IsBOPTradable())
3020 AddTradeableItem(pLastItem);
3021 }
3022}
ObjectGuid GetOwnerGUID() const
Definition Item.h:231

References ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, AddTradeableItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), Item::GetOwnerGUID(), Item::IsBOPTradable(), ITEM_CHANGED, ITEM_NEW, ItemAddedQuestCheck(), Item::SetOwnerGUID(), Item::SetState(), StoreItem(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleMailTakeItem(), and WorldSession::moveItems().

◆ MustDelayTeleport()

bool Player::MustDelayTeleport ( ) const
inlineprivate
2960{ return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end

References m_bMustDelayTeleport.

Referenced by TeleportTo().

◆ NeedSendSpectatorData()

bool Player::NeedSendSpectatorData ( ) const
15519{
15520 if (FindMap() && FindMap()->IsBattleArena() && !IsSpectator())
15521 {
15522 Battleground* bg = ((BattlegroundMap*)FindMap())->GetBG();
15523 if (bg && bg->HaveSpectators() && bg->GetStatus() == STATUS_IN_PROGRESS && !bg->GetPlayers().empty())
15524 if (bg->GetPlayers().find(GetGUID()) != bg->GetPlayers().end())
15525 return true;
15526 }
15527 return false;
15528}
Definition Map.h:680
bool HaveSpectators()
Definition Battleground.h:398
BattlegroundPlayerMap const & GetPlayers() const
Definition Battleground.h:409
bool IsSpectator() const
Definition Player.h:2576

References WorldObject::FindMap(), Object::GetGUID(), Battleground::GetPlayers(), Battleground::GetStatus(), Battleground::HaveSpectators(), IsSpectator(), and STATUS_IN_PROGRESS.

Referenced by _AddSpellCooldown(), Spell::cancel(), RemovePet(), Spell::SendChannelStart(), SendClearCooldown(), Spell::SendSpellStart(), setDeathState(), Unit::SetHealth(), Unit::SetMaxHealth(), Unit::SetMaxPower(), Unit::SetPower(), SetSelection(), and SummonPet().

◆ NeedToSaveGlyphs()

bool Player::NeedToSaveGlyphs ( )
inline
2601{ return m_NeedToSaveGlyphs; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs().

◆ OCTRegenHPPerSpirit()

float Player::OCTRegenHPPerSpirit ( )
5237{
5238 uint8 level = GetLevel();
5239 uint32 pclass = getClass();
5240
5241 if (level > GT_MAX_LEVEL)
5242 level = GT_MAX_LEVEL;
5243
5244 GtOCTRegenHPEntry const* baseRatio = sGtOCTRegenHPStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5245 GtRegenHPPerSptEntry const* moreRatio = sGtRegenHPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5246 if (!baseRatio || !moreRatio)
5247 return 0.0f;
5248
5249 // Formula from PaperDollFrame script
5250 float spirit = GetStat(STAT_SPIRIT);
5251 float baseSpirit = spirit;
5252 if (baseSpirit > 50)
5253 baseSpirit = 50;
5254 float moreSpirit = spirit - baseSpirit;
5255 float regen = (baseSpirit * baseRatio->ratio + moreSpirit * moreRatio->ratio) * 2;
5256 return regen;
5257}
DBCStorage< GtRegenHPPerSptEntry > sGtRegenHPPerSptStore(GtRegenHPPerSptfmt)
DBCStorage< GtOCTRegenHPEntry > sGtOCTRegenHPStore(GtOCTRegenHPfmt)
Definition DBCStructure.h:1083
float ratio
Definition DBCStructure.h:1084
Definition DBCStructure.h:1093
float ratio
Definition DBCStructure.h:1094

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtOCTRegenHPEntry::ratio, GtRegenHPPerSptEntry::ratio, sGtOCTRegenHPStore, sGtRegenHPPerSptStore, and STAT_SPIRIT.

Referenced by RegenerateHealth().

◆ OCTRegenMPPerSpirit()

float Player::OCTRegenMPPerSpirit ( )
5260{
5261 uint8 level = GetLevel();
5262 uint32 pclass = getClass();
5263
5264 if (level > GT_MAX_LEVEL)
5265 level = GT_MAX_LEVEL;
5266
5267 // GtOCTRegenMPEntry const* baseRatio = sGtOCTRegenMPStore.LookupEntry((pclass-1)*GT_MAX_LEVEL + level-1);
5268 GtRegenMPPerSptEntry const* moreRatio = sGtRegenMPPerSptStore.LookupEntry((pclass - 1) * GT_MAX_LEVEL + level - 1);
5269 if (!moreRatio)
5270 return 0.0f;
5271
5272 // Formula get from PaperDollFrame script
5273 float spirit = GetStat(STAT_SPIRIT);
5274 float regen = spirit * moreRatio->ratio;
5275 return regen;
5276}
DBCStorage< GtRegenMPPerSptEntry > sGtRegenMPPerSptStore(GtRegenMPPerSptfmt)
Definition DBCStructure.h:1098
float ratio
Definition DBCStructure.h:1099

References Unit::getClass(), Unit::GetLevel(), Unit::GetStat(), GT_MAX_LEVEL, GtRegenMPPerSptEntry::ratio, sGtRegenMPPerSptStore, and STAT_SPIRIT.

Referenced by UpdateManaRegen().

◆ OfflineResurrect()

◆ OnGossipSelect()

void Player::OnGossipSelect ( WorldObject source,
uint32  gossipListId,
uint32  menuId 
)
245{
247
248 // if not same, then something funky is going on
249 if (menuId != gossipMenu.GetMenuId())
250 return;
251
252 GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
253 if (!item)
254 return;
255
256 uint32 gossipOptionId = item->OptionType;
257 ObjectGuid guid = source->GetGUID();
258
259 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && source->IsCreature())
260 {
262 {
264
267 else
269
271 return;
272 }
273 }
274
275 if (source->IsGameObject())
276 {
277 if (gossipOptionId > GOSSIP_OPTION_QUESTGIVER)
278 {
279 LOG_ERROR("entities.player", "Player guid {} request invalid gossip option for GameObject entry {}", GetGUID().ToString(), source->GetEntry());
280 return;
281 }
282 }
283
284 GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
285 if (!menuItemData)
286 return;
287
288 int32 cost = int32(item->BoxMoney);
289 if (!HasEnoughMoney(cost))
290 {
293 return;
294 }
295
296 switch (gossipOptionId)
297 {
300 {
301 if (menuItemData->GossipActionPoi)
303
304 if (menuItemData->GossipActionMenuId)
305 {
306 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
307 SendPreparedGossip(source);
308 }
309
310 break;
311 }
313 sOutdoorPvPMgr->HandleGossipOption(this, source->ToCreature(), gossipListId);
314 break;
316 if (isDead())
317 source->ToCreature()->CastSpell(source->ToCreature(), 17251, true, nullptr, nullptr, GetGUID());
318 break;
320 PrepareQuestMenu(guid);
321 SendPreparedQuest(guid);
322 break;
325 GetSession()->SendListInventory(guid, menuItemData->GossipActionMenuId);
326 break;
328 GetSession()->SendStablePet(guid);
329 break;
332 break;
334 if (GetSpecsCount() == 1 && GetLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))
335 {
336 // Cast spells that teach dual spec
337 // Both are also ImplicitTarget self and must be cast by player
338 CastSpell(this, 63680, true, nullptr, nullptr, GetGUID());
339 CastSpell(this, 63624, true, nullptr, nullptr, GetGUID());
340
341 PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
342 SendPreparedGossip(source);
343 }
344 break;
348 break;
352 break;
354 GetSession()->SendTaxiMenu(source->ToCreature());
355 break;
358 SetBindPoint(guid);
359 break;
361 GetSession()->SendShowBank(guid);
362 break;
366 break;
370 break;
372 GetSession()->SendAuctionHello(guid, source->ToCreature());
373 break;
375 PrepareGossipMenu(source);
376 SendPreparedGossip(source);
377 break;
379 {
380 BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
381
382 if (bgTypeId == BATTLEGROUND_TYPE_NONE)
383 {
384 LOG_ERROR("entities.player", "A user ({}) requested battlegroundlist from a npc who is no battlemaster", GetGUID().ToString());
385 return;
386 }
387
388 GetSession()->SendBattleGroundList(guid, bgTypeId);
389 break;
390 }
391 }
392
393 ModifyMoney(-cost);
394}
@ GOSSIP_OPTION_AUCTIONEER
Definition GossipDef.h:48
@ GOSSIP_OPTION_UNLEARNTALENTS
Definition GossipDef.h:51
@ GOSSIP_OPTION_TRAINER
Definition GossipDef.h:40
@ GOSSIP_OPTION_ARMORER
Definition GossipDef.h:50
@ GOSSIP_OPTION_UNLEARNPETTALENTS
Definition GossipDef.h:52
@ GOSSIP_OPTION_OUTDOORPVP
Definition GossipDef.h:54
@ GOSSIP_OPTION_BATTLEFIELD
Definition GossipDef.h:47
@ GOSSIP_OPTION_TABARDDESIGNER
Definition GossipDef.h:46
@ GOSSIP_OPTION_TAXIVENDOR
Definition GossipDef.h:39
@ GOSSIP_OPTION_QUESTGIVER
Definition GossipDef.h:37
@ GOSSIP_OPTION_LEARNDUALSPEC
Definition GossipDef.h:53
@ GOSSIP_OPTION_INNKEEPER
Definition GossipDef.h:43
@ GOSSIP_OPTION_SPIRITGUIDE
Definition GossipDef.h:42
@ GOSSIP_OPTION_DUALSPEC_INFO
Definition GossipDef.h:55
@ GOSSIP_OPTION_PETITIONER
Definition GossipDef.h:45
@ GOSSIP_OPTION_BANKER
Definition GossipDef.h:44
@ GOSSIP_OPTION_GOSSIP
Definition GossipDef.h:36
@ GOSSIP_OPTION_SPIRITHEALER
Definition GossipDef.h:41
@ GOSSIP_OPTION_STABLEPET
Definition GossipDef.h:49
@ LANG_INSTANT_FLIGHT_OFF
Definition Language.h:1329
@ LANG_INSTANT_FLIGHT_ON
Definition Language.h:1328
@ GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT
Definition Player.h:1013
BattlegroundTypeId
Definition SharedDefines.h:3745
@ BATTLEGROUND_TYPE_NONE
Definition SharedDefines.h:3746
@ UNIT_NPC_FLAG_FLIGHTMASTER
Definition UnitDefines.h:332
@ CONFIG_MIN_DUALSPEC_LEVEL
Definition WorldConfig.h:190
void SendNotification(std::string_view str)
Definition Chat.cpp:105
Definition GossipDef.h:163
GossipMenuItem const * GetItem(uint32 id) const
Definition GossipDef.h:188
uint32 GetMenuId() const
Definition GossipDef.h:172
GossipMenuItemData const * GetItemData(uint32 indexId) const
Definition GossipDef.h:197
bool IsGameObject() const
Definition Object.h:213
Unit * ToUnit()
Definition Object.h:210
void SendCloseGossip()
Definition GossipDef.cpp:239
void SendPointOfInterest(uint32 poiId) const
Definition GossipDef.cpp:247
GossipMenu & GetGossipMenu()
Definition GossipDef.h:264
void SendTalentWipeConfirm(ObjectGuid guid)
Definition Player.cpp:8949
void SendPreparedGossip(WorldObject *source)
Definition PlayerGossip.cpp:209
void SendPreparedQuest(ObjectGuid guid)
Definition PlayerQuest.cpp:115
void ToggleInstantFlight()
Definition PlayerGossip.cpp:437
void ResetPetTalents()
Definition Player.cpp:8958
void PrepareQuestMenu(ObjectGuid guid)
Definition PlayerQuest.cpp:39
void SetBindPoint(ObjectGuid guid)
Definition Player.cpp:8942
void PrepareGossipMenu(WorldObject *source, uint32 menuId=0, bool showQuests=false)
Definition PlayerGossip.cpp:32
NPCFlags GetNpcFlags() const
Clears emote state (looping emote)
Definition Unit.h:747
void SendAuctionHello(ObjectGuid guid, Creature *unit)
Definition AuctionHouseHandler.cpp:53
void SendPetitionShowList(ObjectGuid guid)
Definition PetitionsHandler.cpp:828
void SendTaxiMenu(Creature *unit)
Definition TaxiHandler.cpp:84
void SendListInventory(ObjectGuid guid, uint32 vendorEntry=0)
Definition ItemHandler.cpp:851
void SendTrainerList(ObjectGuid guid)
Definition NPCHandler.cpp:87
void SendShowBank(ObjectGuid guid)
Definition BankHandler.cpp:188
void SendStablePet(ObjectGuid guid)
Definition NPCHandler.cpp:480
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId=BATTLEGROUND_RB)
Definition BattleGroundHandler.cpp:67
void SendTabardVendorActivate(ObjectGuid guid)
Definition NPCHandler.cpp:65
Definition GossipDef.h:146
uint32 GossipActionMenuId
Definition GossipDef.h:147
uint32 GossipActionPoi
Definition GossipDef.h:148
Definition GossipDef.h:132
uint32 OptionType
Definition GossipDef.h:137
uint32 BoxMoney
Definition GossipDef.h:139

References BATTLEGROUND_TYPE_NONE, GossipMenuItem::BoxMoney, BUY_ERR_NOT_ENOUGHT_MONEY, Unit::CastSpell(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, Object::GetEntry(), PlayerMenu::GetGossipMenu(), Object::GetGUID(), Object::GetGUID(), GossipMenu::GetItem(), GossipMenu::GetItemData(), Unit::GetLevel(), GossipMenu::GetMenuId(), Unit::GetNpcFlags(), GetSession(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, GossipMenuItemData::GossipActionMenuId, GossipMenuItemData::GossipActionPoi, HasEnoughMoney(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_INSTANT_FLIGHT_OFF, LANG_INSTANT_FLIGHT_ON, LOG_ERROR, m_isInstantFlightOn, ModifyMoney(), GossipMenuItem::OptionType, PlayerTalkClass, PrepareGossipMenu(), PrepareQuestMenu(), ResetPetTalents(), sBattlegroundMgr, WorldSession::SendAuctionHello(), WorldSession::SendBattleGroundList(), SendBuyError(), PlayerMenu::SendCloseGossip(), WorldSession::SendListInventory(), ChatHandler::SendNotification(), WorldSession::SendPetitionShowList(), PlayerMenu::SendPointOfInterest(), SendPreparedGossip(), SendPreparedQuest(), WorldSession::SendShowBank(), WorldSession::SendStablePet(), WorldSession::SendTabardVendorActivate(), SendTalentWipeConfirm(), WorldSession::SendTaxiMenu(), WorldSession::SendTrainerList(), SetBindPoint(), sOutdoorPvPMgr, sWorld, Object::ToCreature(), ToggleInstantFlight(), Position::ToString(), Object::ToUnit(), and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by WorldSession::HandleGossipSelectOptionOpcode().

◆ outDebugValues()

void Player::outDebugValues ( ) const
protected
7796{
7797 if (!sLog->ShouldLog("entities.player", LogLevel::LOG_LEVEL_DEBUG)) // optimize disabled debug output
7798 return;
7799
7800 LOG_DEBUG("entities.player", "HP is: \t\t\t{}\t\tMP is: \t\t\t{}", GetMaxHealth(), GetMaxPower(POWER_MANA));
7801 LOG_DEBUG("entities.player", "AGILITY is: \t\t{}\t\tSTRENGTH is: \t\t{}", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));
7802 LOG_DEBUG("entities.player", "INTELLECT is: \t\t{}\t\tSPIRIT is: \t\t{}", GetStat(STAT_INTELLECT), GetStat(STAT_SPIRIT));
7803 LOG_DEBUG("entities.player", "STAMINA is: \t\t{}", GetStat(STAT_STAMINA));
7804 LOG_DEBUG("entities.player", "Armor is: \t\t{}\t\tBlock is: \t\t{}", GetArmor(), GetFloatValue(PLAYER_BLOCK_PERCENTAGE));
7805 LOG_DEBUG("entities.player", "HolyRes is: \t\t{}\t\tFireRes is: \t\t{}", GetResistance(SPELL_SCHOOL_HOLY), GetResistance(SPELL_SCHOOL_FIRE));
7806 LOG_DEBUG("entities.player", "NatureRes is: \t\t{}\t\tFrostRes is: \t\t{}", GetResistance(SPELL_SCHOOL_NATURE), GetResistance(SPELL_SCHOOL_FROST));
7807 LOG_DEBUG("entities.player", "ShadowRes is: \t\t{}\t\tArcaneRes is: \t\t{}", GetResistance(SPELL_SCHOOL_SHADOW), GetResistance(SPELL_SCHOOL_ARCANE));
7808 LOG_DEBUG("entities.player", "MIN_DAMAGE is: \t\t{}\tMAX_DAMAGE is: \t\t{}", GetFloatValue(UNIT_FIELD_MINDAMAGE), GetFloatValue(UNIT_FIELD_MAXDAMAGE));
7809 LOG_DEBUG("entities.player", "MIN_OFFHAND_DAMAGE is: \t{}\tMAX_OFFHAND_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINOFFHANDDAMAGE), GetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE));
7810 LOG_DEBUG("entities.player", "MIN_RANGED_DAMAGE is: \t{}\tMAX_RANGED_DAMAGE is: \t{}", GetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE), GetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE));
7811 LOG_DEBUG("entities.player", "ATTACK_TIME is: \t{}\t\tRANGE_ATTACK_TIME is: \t{}", GetAttackTime(BASE_ATTACK), GetAttackTime(RANGED_ATTACK));
7812}
@ LOG_LEVEL_DEBUG
Definition LogCommon.h:31
#define sLog
Definition Log.h:127
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:299
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:297
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:298
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:296
uint32 GetArmor() const
Definition Unit.h:1120

References BASE_ATTACK, Unit::GetArmor(), Unit::GetAttackTime(), Object::GetFloatValue(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetResistance(), Unit::GetStat(), LOG_DEBUG, LOG_LEVEL_DEBUG, PLAYER_BLOCK_PERCENTAGE, POWER_MANA, RANGED_ATTACK, sLog, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_SHADOW, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by LoadFromDB(), and SaveToDB().

◆ PetSpellInitialize()

void Player::PetSpellInitialize ( )
9553{
9554 Pet* pet = GetPet();
9555
9556 if (!pet)
9557 return;
9558
9559 LOG_DEBUG("entities.pet", "Pet Spells Groups");
9560
9561 CharmInfo* charmInfo = pet->GetCharmInfo();
9562
9563 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9564 data << pet->GetGUID();
9565 data << uint16(pet->GetCreatureTemplate()->family); // creature family (required for pet talents)
9566 data << uint32(pet->GetDuration().count());
9567 data << uint8(pet->GetReactState());
9568 data << uint8(charmInfo->GetCommandState());
9569 data << uint16(0); // Flags, mostly unknown
9570
9571 // action bar loop
9572 charmInfo->BuildActionBar(&data);
9573
9574 std::size_t spellsCountPos = data.wpos();
9575
9576 // spells count
9577 uint8 addlist = 0;
9578 data << uint8(addlist); // placeholder
9579
9580 if (pet->IsPermanentPetFor(this))
9581 {
9582 // spells loop
9583 for (PetSpellMap::iterator itr = pet->m_spells.begin(); itr != pet->m_spells.end(); ++itr)
9584 {
9585 if (itr->second.state == PETSPELL_REMOVED)
9586 continue;
9587
9588 data << uint32(MAKE_UNIT_ACTION_BUTTON(itr->first, itr->second.active));
9589 ++addlist;
9590 }
9591 }
9592
9593 data.put<uint8>(spellsCountPos, addlist);
9594
9595 uint8 cooldownsCount = pet->m_CreatureSpellCooldowns.size();
9596 data << uint8(cooldownsCount);
9597
9598 uint32 curTime = GameTime::GetGameTimeMS().count();
9600
9601 for (CreatureSpellCooldowns::const_iterator itr = pet->m_CreatureSpellCooldowns.begin(); itr != pet->m_CreatureSpellCooldowns.end(); ++itr)
9602 {
9603 uint16 category = itr->second.category;
9604 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9605
9606 data << uint32(itr->first); // spellid
9607 data << uint16(itr->second.category); // spell category
9608
9609 // send infinity cooldown in special format
9610 if (itr->second.end >= infTime)
9611 {
9612 data << uint32(1); // cooldown
9613 data << uint32(0x80000000); // category cooldown
9614 continue;
9615 }
9616
9617 data << uint32(category ? 0 : cooldown); // cooldown
9618 data << uint32(category ? cooldown : 0); // category cooldown
9619 }
9620
9621 SendDirectMessage(&data);
9622}
#define MAKE_UNIT_ACTION_BUTTON(A, T)
Definition CharmInfo.h:33
@ PETSPELL_REMOVED
Definition PetDefines.h:61
CreatureSpellCooldowns m_CreatureSpellCooldowns
Definition Creature.h:254
bool IsPermanentPetFor(Player *owner) const
Definition Pet.cpp:2301
Milliseconds GetDuration() const
Definition Pet.h:91
PetSpellMap m_spells
Definition Pet.h:121

References CharmInfo::BuildActionBar(), CreatureTemplate::family, Unit::GetCharmInfo(), CharmInfo::GetCommandState(), Creature::GetCreatureTemplate(), Pet::GetDuration(), GameTime::GetGameTimeMS(), Object::GetGUID(), GetPet(), Creature::GetReactState(), infinityCooldownDelayCheck, Pet::IsPermanentPetFor(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Pet::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_UNIT_ACTION_BAR_INDEX, PETSPELL_REMOVED, ByteBuffer::put(), SendDirectMessage(), SMSG_PET_SPELLS, and ByteBuffer::wpos().

Referenced by CreatePet(), CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectLearnPetSpell(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), AuraEffect::HandleModPossessPet(), WorldSession::HandlePlayerLoginToCharInWorld(), WorldSession::HandleRequestPetInfo(), Pet::learnSpell(), Pet::LoadPetFromDB(), Pet::resetTalents(), Unit::SetMinion(), and SummonPet().

◆ PossessSpellInitialize()

void Player::PossessSpellInitialize ( )
9625{
9626 Unit* charm = GetCharm();
9627 if (!charm)
9628 return;
9629
9630 CharmInfo* charmInfo = charm->GetCharmInfo();
9631
9632 if (!charmInfo)
9633 {
9634 LOG_ERROR("entities.player", "Player::PossessSpellInitialize(): charm ({}) has no charminfo!", charm->GetGUID().ToString());
9635 return;
9636 }
9637
9638 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * MAX_UNIT_ACTION_BAR_INDEX + 1 + 1);
9639 data << charm->GetGUID();
9640 data << uint16(0);
9641 data << uint32(0);
9642 data << uint32(0);
9643
9644 charmInfo->BuildActionBar(&data);
9645
9646 data << uint8(0); // spells count
9647 data << uint8(0); // cooldowns count
9648
9649 SendDirectMessage(&data);
9650}
Unit * GetCharm() const
Definition Unit.cpp:10747

References CharmInfo::BuildActionBar(), Unit::GetCharm(), Unit::GetCharmInfo(), Object::GetGUID(), LOG_ERROR, MAX_UNIT_ACTION_BAR_INDEX, SendDirectMessage(), SMSG_PET_SPELLS, and ObjectGuid::ToString().

Referenced by Unit::SetCharmedBy().

◆ PrepareCharmAISpells()

void Player::PrepareCharmAISpells ( )
15531{
15532 for (int i = 0; i < NUM_CAI_SPELLS; ++i)
15533 m_charmAISpells[i] = 0;
15534
15535 uint32 damage_type[4] = {0, 0, 0, 0};
15536 uint32 periodic_damage = 0;
15537
15538 for (PlayerSpellMap::iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
15539 {
15540 if (itr->second->State == PLAYERSPELL_REMOVED || !itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
15541 continue;
15542
15543 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
15544 if (!spellInfo)
15545 continue;
15546
15547 if (!spellInfo->SpellFamilyName || spellInfo->IsPassive() || spellInfo->NeedsComboPoints() || (spellInfo->Stances && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED)))
15548 continue;
15549
15550 float cast = spellInfo->CalcCastTime() / 1000.0f;
15551 if (cast > 3.0f)
15552 continue;
15553
15554 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
15555 {
15556 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
15557 {
15558 int32 dmg = CalculateSpellDamage(this, spellInfo, i);
15559 uint8 offset = 0;
15560 if (cast)
15561 {
15562 dmg = dmg / cast;
15563 offset = 2;
15564 }
15565
15566 if ((int32)damage_type[offset] < dmg)
15567 {
15568 if (!m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] || !spellInfo->IsHighRankOf(sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])) || urand(0, 1))
15569 if (damage_type[1 + offset] < damage_type[offset])
15570 {
15572 damage_type[1 + offset] = damage_type[offset];
15573 }
15574
15575 m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] = spellInfo->Id;
15576 damage_type[offset] = dmg;
15577 }
15578 else if ((int32)damage_type[1 + offset] < dmg)
15579 {
15580 if (m_charmAISpells[SPELL_INSTANT_DAMAGE + offset] && sSpellMgr->GetSpellInfo(m_charmAISpells[SPELL_INSTANT_DAMAGE + offset])->IsHighRankOf(spellInfo) && urand(0, 1))
15581 continue;
15582
15583 m_charmAISpells[SPELL_INSTANT_DAMAGE2 + offset] = spellInfo->Id;
15584 damage_type[1 + offset] = dmg;
15585 }
15586 break;
15587 }
15589 {
15590 m_charmAISpells[SPELL_T_CHARGE] = spellInfo->Id;
15591 break;
15592 }
15593 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_SPEED)
15594 {
15595 m_charmAISpells[SPELL_FAST_RUN] = spellInfo->Id;
15596 break;
15597 }
15598 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_SCHOOL_IMMUNITY)
15599 {
15600 m_charmAISpells[SPELL_IMMUNITY] = spellInfo->Id;
15601 break;
15602 }
15603 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE)
15604 {
15605 if ((int32)periodic_damage < CalculateSpellDamage(this, spellInfo, i))
15606 {
15607 m_charmAISpells[SPELL_DOT_DAMAGE] = spellInfo->Id;
15608 break;
15609 }
15610 }
15611 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_STUN)
15612 {
15613 m_charmAISpells[SPELL_T_STUN] = spellInfo->Id;
15614 break;
15615 }
15616 else if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_ROOT || spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_FEAR)
15617 {
15619 break;
15620 }
15621 }
15622 }
15623}
@ SPELL_ROOT_OR_FEAR
Definition Player.h:911
@ SPELL_INSTANT_DAMAGE2
Definition Player.h:913
@ SPELL_INSTANT_DAMAGE
Definition Player.h:912
@ SPELL_T_CHARGE
Definition Player.h:917
@ SPELL_DOT_DAMAGE
Definition Player.h:916
@ SPELL_FAST_RUN
Definition Player.h:919
@ SPELL_T_STUN
Definition Player.h:910
@ SPELL_IMMUNITY
Definition Player.h:918
@ SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT
Definition SharedDefines.h:670
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:791
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool IsHighRankOf(SpellInfo const *spellInfo) const
Definition SpellInfo.cpp:2597
bool NeedsComboPoints() const
Definition SpellInfo.cpp:1266
uint32 CalcCastTime(Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2364
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14880

References SpellInfo::CalcCastTime(), Unit::CalculateSpellDamage(), SpellInfo::Effects, GetActiveSpec(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsHighRankOf(), SpellInfo::IsPassive(), m_charmAISpells, m_spells, MAX_SPELL_EFFECTS, SpellInfo::NeedsComboPoints(), NUM_CAI_SPELLS, PLAYERSPELL_REMOVED, SPELL_ATTR2_ALLOW_WHILE_NOT_SHAPESHIFTED, SPELL_ATTR7_ATTACK_ON_CHARGE_TO_UNIT, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_SCHOOL_IMMUNITY, SPELL_DOT_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_FAST_RUN, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_INSTANT_DAMAGE2, SPELL_ROOT_OR_FEAR, SPELL_T_CHARGE, SPELL_T_STUN, SpellInfo::SpellFamilyName, sSpellMgr, SpellInfo::Stances, and urand().

Referenced by LoadFromDB().

◆ PrepareGossipMenu()

void Player::PrepareGossipMenu ( WorldObject source,
uint32  menuId = 0,
bool  showQuests = false 
)

Find localizations from database.

Find localizations from database.

33{
35 menu->ClearMenus();
36
37 menu->GetGossipMenu().SetMenuId(menuId);
38
39 GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId);
40
41 // if default menuId and no menu options exist for this, use options from default options
42 if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source))
43 menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0);
44
45 uint32 npcflags = 0;
46
47 if (source->IsCreature())
48 {
49 npcflags = source->ToUnit()->GetNpcFlags();
50 if (showQuests && npcflags & UNIT_NPC_FLAG_QUESTGIVER)
51 PrepareQuestMenu(source->GetGUID());
52 }
53 else if (source->IsGameObject())
54 if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER)
55 PrepareQuestMenu(source->GetGUID());
56
57 for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr)
58 {
59 bool canTalk = true;
60 if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions))
61 continue;
62
63 if (Creature* creature = source->ToCreature())
64 {
65 if (!(itr->second.OptionNpcFlag & npcflags))
66 continue;
67
68 switch (itr->second.OptionType)
69 {
71 canTalk = false; // added in special mode
72 break;
74 if (!isDead())
75 canTalk = false;
76 break;
78 {
79 if (!creature->isVendorWithIconSpeak())
80 {
81 VendorItemData const* vendorItems = itr->second.ActionMenuID ? sObjectMgr->GetNpcVendorItemList(itr->second.ActionMenuID) : creature->GetVendorItems();
82 if (!vendorItems || vendorItems->Empty())
83 {
84 LOG_ERROR("sql.sql", "Creature {} have UNIT_NPC_FLAG_VENDOR but have empty trading item list.", creature->GetGUID().ToString());
85 canTalk = false;
86 }
87 break;
88 }
89 break;
90 }
93 if (!(GetSpecsCount() == 1 && creature->isCanTrainingAndResetTalentsOf(this) && !(GetLevel() < sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL))))
94 canTalk = false;
95 break;
97 if (!creature->isCanTrainingAndResetTalentsOf(this))
98 canTalk = false;
99 break;
101 if (!GetPet() || GetPet()->getPetType() != HUNTER_PET || GetPet()->m_spells.size() <= 1 || creature->GetCreatureTemplate()->trainer_type != TRAINER_TYPE_PETS || creature->GetCreatureTemplate()->trainer_class != CLASS_HUNTER)
102 canTalk = false;
103 break;
105 if (GetSession()->SendLearnNewTaxiNode(creature))
106 return;
107 break;
109 if (!creature->isCanInteractWithBattleMaster(this, false))
110 canTalk = false;
111 break;
114 canTalk = false;
115 break;
117 canTalk = false;
118 break;
120 if (!creature->IsValidTrainerForPlayer(this))
121 {
122 canTalk = false;
123 }
124 break;
126 if (creature->isVendorWithIconSpeak())
127 {
128 VendorItemData const* vendorItems = creature->GetVendorItems();
129 if (!vendorItems || vendorItems->Empty())
130 {
131 canTalk = false;
132 }
133 }
134 break;
141 break; // no checks
143 if (!sOutdoorPvPMgr->CanTalkTo(this, creature, itr->second))
144 canTalk = false;
145 break;
146 default:
147 LOG_ERROR("sql.sql", "Creature entry {} has unknown OptionType {} for menu {}", creature->GetEntry(), itr->second.OptionType, itr->second.MenuID);
148 canTalk = false;
149 break;
150 }
151 }
152 else if (GameObject* go = source->ToGameObject())
153 {
154 switch (itr->second.OptionType)
155 {
157 if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER)
158 canTalk = false;
159 break;
160 default:
161 canTalk = false;
162 break;
163 }
164 }
165
166 if (canTalk)
167 {
168 // using gossip_menu_option texts by default
169 std::string strOptionText = itr->second.OptionText;
170 std::string strBoxText = itr->second.BoxText;
171 // search in broadcast_text and broadcast_text_locale
172 BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID);
173 BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID);
175
176 if (optionBroadcastText)
177 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? optionBroadcastText->MaleText : optionBroadcastText->FemaleText, locale, strOptionText);
178
179 if (boxBroadcastText)
180 ObjectMgr::GetLocaleString(getGender() == GENDER_MALE ? boxBroadcastText->MaleText : boxBroadcastText->FemaleText, locale, strBoxText);
181
182 // if the language is not default and the texts weren't found, maybe they're in gossip_menu_option_locale table
183 if (locale != DEFAULT_LOCALE)
184 {
185 if (!optionBroadcastText)
186 {
188 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
189 ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
190 }
191
192 if (!boxBroadcastText)
193 {
195 if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(MAKE_PAIR32(menuId, itr->second.OptionID)))
196 ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
197 }
198 }
199
200 menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
201 menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
202 }
203 }
204
205 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && npcflags & UNIT_NPC_FLAG_FLIGHTMASTER)
207}
LocaleConstant
Definition Common.h:117
#define DEFAULT_LOCALE
Definition Common.h:131
@ GOSSIP_ICON_INTERACT_1
Definition GossipDef.h:65
@ LANG_TOGGLE_INSTANT_FLIGHT
Definition Language.h:1327
@ HUNTER_PET
Definition PetDefines.h:33
@ GAMEOBJECT_TYPE_GOOBER
Definition SharedDefines.h:1581
@ TRAINER_TYPE_PETS
Definition SharedDefines.h:2631
GameobjectTypes GetGoType() const
Definition GameObject.h:202
void SetMenuId(uint32 menu_id)
Definition GossipDef.h:171
void AddMenuItem(int32 menuItemId, uint8 icon, std::string const &message, uint32 sender, uint32 action, std::string const &boxMessage, uint32 boxMoney, bool coded=false)
Definition GossipDef.cpp:41
void AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
Definition GossipDef.cpp:136
static std::string_view GetLocaleString(std::vector< std::string > const &data, std::size_t locale)
Definition ObjectMgr.h:1419
void ClearMenus()
Definition GossipDef.cpp:187
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:560
AC_GAME_API std::string GetAcoreString(ChatHandler const *handler, AcoreStrings which)
Definition ChatCommandHelpers.cpp:27
Definition ObjectMgr.h:434
std::vector< std::string > MaleText
Definition ObjectMgr.h:443
Definition CreatureData.h:349

References GossipMenu::AddGossipMenuItemData(), GossipMenu::AddMenuItem(), CLASS_CONTEXT_PET, CLASS_HUNTER, PlayerMenu::ClearMenus(), CONFIG_INSTANT_TAXI, CONFIG_MIN_DUALSPEC_LEVEL, DEFAULT_LOCALE, VendorItemData::Empty(), BroadcastText::FemaleText, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_QUESTGIVER, GENDER_MALE, WorldSession::GetAcoreString(), Creature::GetCreatureTemplate(), GetDefaultGossipMenuForSource(), Unit::getGender(), PlayerMenu::GetGossipMenu(), GameObject::GetGoType(), Object::GetGUID(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), Unit::GetNpcFlags(), GetPet(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetSpecsCount(), GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT, GOSSIP_ICON_INTERACT_1, GOSSIP_OPTION_ARMORER, GOSSIP_OPTION_AUCTIONEER, GOSSIP_OPTION_BANKER, GOSSIP_OPTION_BATTLEFIELD, GOSSIP_OPTION_DUALSPEC_INFO, GOSSIP_OPTION_GOSSIP, GOSSIP_OPTION_INNKEEPER, GOSSIP_OPTION_LEARNDUALSPEC, GOSSIP_OPTION_OUTDOORPVP, GOSSIP_OPTION_PETITIONER, GOSSIP_OPTION_QUESTGIVER, GOSSIP_OPTION_SPIRITGUIDE, GOSSIP_OPTION_SPIRITHEALER, GOSSIP_OPTION_STABLEPET, GOSSIP_OPTION_TABARDDESIGNER, GOSSIP_OPTION_TAXIVENDOR, GOSSIP_OPTION_TRAINER, GOSSIP_OPTION_UNLEARNPETTALENTS, GOSSIP_OPTION_UNLEARNTALENTS, GOSSIP_OPTION_VENDOR, HUNTER_PET, IsClass(), Object::IsCreature(), Unit::isDead(), Object::IsGameObject(), LANG_TOGGLE_INSTANT_FLIGHT, LOG_ERROR, m_spells, MAKE_PAIR32(), BroadcastText::MaleText, PlayerTalkClass, PrepareQuestMenu(), sConditionMgr, GossipMenu::SetMenuId(), sObjectMgr, sOutdoorPvPMgr, sWorld, Object::ToCreature(), Object::ToGameObject(), Object::ToUnit(), CreatureTemplate::trainer_type, TRAINER_TYPE_PETS, UNIT_NPC_FLAG_FLIGHTMASTER, and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), brann_bronzebeard::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ PrepareQuestMenu()

void Player::PrepareQuestMenu ( ObjectGuid  guid)
40{
41 QuestRelationBounds objectQR;
42 QuestRelationBounds objectQIR;
43
44 // pets also can have quests
46 if (creature)
47 {
48 objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry());
49 objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
50 }
51 else
52 {
53 //we should obtain map pointer from GetMap() in 99% of cases. Special case
54 //only for quests which cast teleport spells on player
56 ASSERT(_map);
57 GameObject* pGameObject = _map->GetGameObject(guid);
58 if (pGameObject)
59 {
60 objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry());
61 objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry());
62 }
63 else
64 return;
65 }
66
68 qm.ClearMenu();
69
70 for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i)
71 {
72 uint32 quest_id = i->second;
73 QuestStatus status = GetQuestStatus(quest_id);
74 if (status == QUEST_STATUS_COMPLETE)
75 qm.AddMenuItem(quest_id, 4);
76 else if (status == QUEST_STATUS_INCOMPLETE)
77 qm.AddMenuItem(quest_id, 4);
78 //else if (status == QUEST_STATUS_AVAILABLE)
79 // qm.AddMenuItem(quest_id, 2);
80 }
81
82 for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i)
83 {
84 uint32 quest_id = i->second;
85 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
86 if (!quest)
87 continue;
88
89 if (!CanTakeQuest(quest, false))
90 continue;
91
92 if (quest->IsAutoComplete() && (!quest->IsRepeatable() || quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly()))
93 qm.AddMenuItem(quest_id, 0);
94 else if (quest->IsAutoComplete())
95 qm.AddMenuItem(quest_id, 4);
96 else if (GetQuestStatus(quest_id) == QUEST_STATUS_NONE)
97 qm.AddMenuItem(quest_id, 2);
98 }
99}
QuestMenu & GetQuestMenu()
Definition GossipDef.h:265
Definition GossipDef.h:229
void ClearMenu()
Definition GossipDef.cpp:310
void AddMenuItem(uint32 QuestId, uint8 Icon)
Definition GossipDef.cpp:286

References QuestMenu::AddMenuItem(), ASSERT, CanTakeQuest(), QuestMenu::ClearMenu(), ObjectAccessor::GetCreatureOrPetOrVehicle(), Object::GetEntry(), Map::GetGameObject(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), PlayerMenu::GetQuestMenu(), GetQuestStatus(), Quest::IsAutoComplete(), Quest::IsDaily(), Object::IsInWorld(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), PlayerTalkClass, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, sMapMgr, and sObjectMgr.

Referenced by npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), npc_sayge::OnGossipHello(), go_fel_crystalforge::OnGossipHello(), go_bashir_crystalforge::OnGossipHello(), OnGossipSelect(), PrepareGossipMenu(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ PrettyPrintRequirementsAchievementsList()

void Player::PrettyPrintRequirementsAchievementsList ( const std::vector< const ProgressionRequirement * > &  missingAchievements) const
6649{
6651 for (const ProgressionRequirement* missingReq : missingAchievements)
6652 {
6653 AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(missingReq->id);
6654 if (!achievementEntry)
6655 {
6656 continue;
6657 }
6658
6659 std::string name = achievementEntry->name[sObjectMgr->GetDBCLocaleIndex()];
6660
6661 std::stringstream stream;
6662 stream << "|cffff7c0a|Hachievement:";
6663 stream << missingReq->id;
6664 stream << ":";
6665 stream << GetGUID().ToString();
6666 stream << ":0:0:0:0:0:0:0:0|h[";
6667 stream << name;
6668 stream << "]|h|r";
6669
6670 if (missingReq->note.empty())
6671 {
6672 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6673 }
6674 else
6675 {
6676 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6677 }
6678 }
6679}
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
@ LANG_ACCESS_REQUIREMENT_NOTE
Definition Language.h:851
Definition DBCStructure.h:40
std::array< char const *, 16 > name
Definition DBCStructure.h:45
Definition Player.h:928

References Object::GetGUID(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), LANG_ACCESS_REQUIREMENT_NOTE, AchievementEntry::name, ChatHandler::PSendSysMessage(), sAchievementStore, sObjectMgr, and ObjectGuid::ToString().

Referenced by Satisfy().

◆ PrettyPrintRequirementsItemsList()

void Player::PrettyPrintRequirementsItemsList ( const std::vector< const ProgressionRequirement * > &  missingItems) const
6682{
6684 for (const ProgressionRequirement* missingReq : missingItems)
6685 {
6686 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(missingReq->id);
6687 if (!itemTemplate)
6688 {
6689 continue;
6690 }
6691
6692 //Get the localised name
6693 std::string name = itemTemplate->Name1;
6694 if (ItemLocale const* il = sObjectMgr->GetItemLocale(itemTemplate->ItemId))
6695 {
6696 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6697 }
6698
6699 std::stringstream stream;
6700 stream << "|c";
6701 stream << std::hex << ItemQualityColors[itemTemplate->Quality] << std::dec;
6702 stream << "|Hitem:";
6703 stream << itemTemplate->ItemId;
6704 stream << ":0:0:0:0:0:0:0:0:0|h[";
6705 stream << name;
6706 stream << "]|h|r";
6707
6708 if (missingReq->note.empty())
6709 {
6710 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6711 }
6712 else
6713 {
6714 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6715 }
6716 }
6717}
const uint32 ItemQualityColors[MAX_ITEM_QUALITY]
Definition SharedDefines.h:364
Definition ItemTemplate.h:834
std::string Name1
Definition ItemTemplate.h:624

References ObjectMgr::GetLocaleString(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), ItemTemplate::ItemId, ItemQualityColors, LANG_ACCESS_REQUIREMENT_NOTE, ItemTemplate::Name1, ChatHandler::PSendSysMessage(), ItemTemplate::Quality, and sObjectMgr.

Referenced by Satisfy().

◆ PrettyPrintRequirementsQuestList()

void Player::PrettyPrintRequirementsQuestList ( const std::vector< const ProgressionRequirement * > &  missingQuests) const
6612{
6614 for (const ProgressionRequirement* missingReq : missingQuests)
6615 {
6616 Quest const* questTemplate = sObjectMgr->GetQuestTemplate(missingReq->id);
6617 if (!questTemplate)
6618 {
6619 continue;
6620 }
6621
6622 std::string questTitle = questTemplate->GetTitle();
6623 if (QuestLocale const* questLocale = sObjectMgr->GetQuestLocale(questTemplate->GetQuestId()))
6624 {
6625 ObjectMgr::GetLocaleString(questLocale->Title, loc_idx, questTitle);
6626 }
6627
6628 std::stringstream stream;
6629 stream << "|cffff7c0a|Hquest:";
6630 stream << questTemplate->GetQuestId();
6631 stream << ":";
6632 stream << questTemplate->GetQuestLevel();
6633 stream << "|h[";
6634 stream << questTitle;
6635 stream << "]|h|r";
6636
6637 if (missingReq->note.empty())
6638 {
6639 ChatHandler(GetSession()).PSendSysMessage(" - {}", stream.str());
6640 }
6641 else
6642 {
6643 ChatHandler(GetSession()).PSendSysMessage(" - {} {} {}", stream.str(), sObjectMgr->GetAcoreString(LANG_ACCESS_REQUIREMENT_NOTE, loc_idx), missingReq->note);
6644 }
6645 }
6646}
int32 GetQuestLevel() const
Definition QuestDef.h:233
std::string const & GetTitle() const
Definition QuestDef.h:261
Definition QuestDef.h:183

References ObjectMgr::GetLocaleString(), Quest::GetQuestId(), Quest::GetQuestLevel(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LANG_ACCESS_REQUIREMENT_NOTE, ChatHandler::PSendSysMessage(), and sObjectMgr.

Referenced by Satisfy().

◆ ProcessDelayedOperations()

void Player::ProcessDelayedOperations ( )
1615{
1616 if (m_DelayedOperations == 0)
1617 return;
1618
1620 {
1621 ResurrectPlayer(0.0f, false);
1622
1625 else
1626 SetFullHealth();
1627
1630 else
1632
1633 SetPower(POWER_RAGE, 0);
1635
1637 }
1638
1640 SaveToDB(false, false);
1641
1643 {
1644 Aura* aura = GetAura(26013);
1645 if (!aura || aura->GetDuration() <= 900000)
1646 CastSpell(this, 26013, true);
1647 }
1648
1650 {
1652 {
1653 // xinef: remove shapeshift auras
1655 {
1657 }
1660 }
1661 }
1662
1664 {
1666 {
1671 }
1672 }
1673
1675 {
1676 if (Group* g = GetGroup())
1677 g->SendUpdateToPlayer(GetGUID());
1678 }
1679
1681 {
1682 if (Vehicle* vehicle = GetVehicle())
1683 {
1684 SeatMap::iterator itr = vehicle->GetSeatIteratorForPassenger(this);
1685 if (itr != vehicle->Seats.end())
1686 if (Unit* base = vehicle->GetBase())
1687 {
1688 ExitVehicle();
1689 base->HandleSpellClick(this, itr->first);
1690 }
1691 }
1692 }
1693
1694 //we have executed ALL delayed ops, so clear the flag
1696}
@ DELAYED_BG_GROUP_RESTORE
Flag to restore group state after teleport from BG.
Definition Player.h:903
@ DELAYED_SAVE_PLAYER
Definition Player.h:898
@ DELAYED_BG_MOUNT_RESTORE
Flag to restore mount state after teleport from BG.
Definition Player.h:901
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:904
@ DELAYED_BG_TAXI_RESTORE
Flag to restore taxi state after teleport from BG.
Definition Player.h:902
@ DELAYED_SPELL_CAST_DESERTER
Definition Player.h:900
@ DELAYED_RESURRECT_PLAYER
Definition Player.h:899
void SaveToDB(bool create, bool logout)
Definition PlayerStorage.cpp:7063
uint32 m_resurrectMana
Definition Player.h:2856
void ContinueTaxiFlight()
Definition Player.cpp:10474
uint32 m_resurrectHealth
Definition Player.h:2856
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:18894
Definition Vehicle.h:28

References Unit::AddAura(), PlayerTaxi::AddTaxiDestination(), Unit::CastSpell(), EntryPointData::ClearTaxiPath(), ContinueTaxiFlight(), DELAYED_BG_GROUP_RESTORE, DELAYED_BG_MOUNT_RESTORE, DELAYED_BG_TAXI_RESTORE, DELAYED_RESURRECT_PLAYER, DELAYED_SAVE_PLAYER, DELAYED_SPELL_CAST_DESERTER, DELAYED_VEHICLE_TELEPORT, Unit::ExitVehicle(), Unit::GetAura(), Aura::GetDuration(), GetGroup(), Object::GetGUID(), Unit::GetMaxHealth(), Unit::GetMaxPower(), Unit::GetVehicle(), EntryPointData::HasTaxiPath(), Unit::IsInDisallowedMountForm(), m_DelayedOperations, m_entryPointData, m_resurrectHealth, m_resurrectMana, m_taxi, EntryPointData::mountSpell, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasByType(), ResurrectPlayer(), SaveToDB(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), SPELL_AURA_MOD_SHAPESHIFT, and EntryPointData::taxiPath.

Referenced by WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ProcessSpellQueue()

void Player::ProcessSpellQueue ( )
protected
2360{
2361 while (!SpellQueue.empty())
2362 {
2363 PendingSpellCastRequest& request = SpellQueue.front(); // Peek at the first spell
2364 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(request.spellId);
2365 if (!spellInfo)
2366 {
2367 LOG_ERROR("entities.player", "Player::ProcessSpellQueue: Invalid spell {}", request.spellId);
2368 SpellQueue.clear();
2369 break;
2370 }
2371 if (CanExecutePendingSpellCastRequest(spellInfo))
2372 {
2374
2375 // ExecuteOrCancelSpellCastRequest() can lead to clearing the SpellQueue.
2376 // Example scenario:
2377 // Handling a spell → Dealing damage to yourself (e.g., spell_pri_vampiric_touch) →
2378 // Killing yourself → Player::setDeathState() → SpellQueue.clear().
2379 // Calling std::deque::pop_front() on an empty deque results in undefined behavior,
2380 // so an additional check is added.
2381 if (!SpellQueue.empty())
2382 SpellQueue.pop_front();
2383 }
2384 else // If the first spell can't execute, stop processing
2385 break;
2386 }
2387}
bool CanExecutePendingSpellCastRequest(SpellInfo const *spellInfo)
Definition PlayerUpdates.cpp:2294
void ExecuteOrCancelSpellCastRequest(PendingSpellCastRequest *castRequest, bool isCancel=false)
Definition PlayerUpdates.cpp:2345
uint32 spellId
Definition Player.h:1060

References CanExecutePendingSpellCastRequest(), ExecuteOrCancelSpellCastRequest(), LOG_ERROR, PendingSpellCastRequest::spellId, SpellQueue, and sSpellMgr.

Referenced by Update().

◆ ProcessTerrainStatusUpdate()

void Player::ProcessTerrainStatusUpdate ( )
overridevirtual

Reimplemented from Unit.

2235{
2236 // process liquid auras using generic unit code
2238
2239 LiquidData const& liquidData = GetLiquidData();
2240
2241 // player specific logic for mirror timers
2242 if (liquidData.Status != LIQUID_MAP_NO_WATER)
2243 {
2244 // Breath bar state (under water in any liquid type)
2245 if ((liquidData.Flags & MAP_ALL_LIQUIDS) != 0)
2246 {
2247 if ((liquidData.Status & LIQUID_MAP_UNDER_WATER) != 0)
2249 else
2250 m_MirrorTimerFlags &= ~UNDERWATER_INWATER;
2251 }
2252
2253 // Fatigue bar state (if not on flight path or transport)
2254 if ((liquidData.Flags & MAP_LIQUID_TYPE_DARK_WATER) && !IsInFlight() && !GetTransport())
2255 {
2256 // Exclude also uncontrollable vehicles
2257 Vehicle* vehicle = GetVehicle();
2258 VehicleSeatEntry const* vehicleSeat = vehicle ? vehicle->GetSeatForPassenger(this) : nullptr;
2259 if (!vehicleSeat || vehicleSeat->CanControl())
2261 else
2262 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2263 }
2264 else
2265 m_MirrorTimerFlags &= ~UNDERWATER_INDARKWATER;
2266
2267 // Lava state (any contact)
2268 if (liquidData.Flags & MAP_LIQUID_TYPE_MAGMA)
2269 {
2270 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2272 else
2273 m_MirrorTimerFlags &= ~UNDERWATER_INLAVA;
2274 }
2275
2276 // Slime state (any contact)
2277 if (liquidData.Flags & MAP_LIQUID_TYPE_SLIME)
2278 {
2279 if (liquidData.Status & MAP_LIQUID_STATUS_IN_CONTACT)
2281 else
2282 m_MirrorTimerFlags &= ~UNDERWATER_INSLIME;
2283 }
2284 }
2285 else
2287}
#define MAP_LIQUID_TYPE_MAGMA
Definition GridTerrainData.h:37
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
#define MAP_LIQUID_TYPE_DARK_WATER
Definition GridTerrainData.h:42
#define MAP_LIQUID_TYPE_SLIME
Definition GridTerrainData.h:38
#define MAP_ALL_LIQUIDS
Definition GridTerrainData.h:40
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195
@ LIQUID_MAP_NO_WATER
Definition GridTerrainData.h:191
@ UNDERWATER_INSLIME
Definition Player.h:104
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4328
VehicleSeatEntry const * GetSeatForPassenger(Unit const *passenger)
Definition Vehicle.cpp:600
LiquidData const & GetLiquidData() const
Definition Object.cpp:3096
Definition GridTerrainData.h:199
uint32 Flags
Definition GridTerrainData.h:203
LiquidStatus Status
Definition GridTerrainData.h:206
Definition DBCStructure.h:2065
bool CanControl() const
Definition DBCStructure.h:2128

References VehicleSeatEntry::CanControl(), LiquidData::Flags, WorldObject::GetLiquidData(), Vehicle::GetSeatForPassenger(), WorldObject::GetTransport(), Unit::GetVehicle(), Unit::IsInFlight(), LIQUID_MAP_NO_WATER, LIQUID_MAP_UNDER_WATER, m_MirrorTimerFlags, MAP_ALL_LIQUIDS, MAP_LIQUID_STATUS_IN_CONTACT, MAP_LIQUID_TYPE_DARK_WATER, MAP_LIQUID_TYPE_MAGMA, MAP_LIQUID_TYPE_SLIME, Unit::ProcessTerrainStatusUpdate(), LiquidData::Status, UNDERWATER_INDARKWATER, UNDERWATER_INLAVA, UNDERWATER_INSLIME, and UNDERWATER_INWATER.

◆ ProhibitSpellSchool()

void Player::ProhibitSpellSchool ( SpellSchoolMask  idSchoolMask,
uint32  unTimeMs 
)
overridevirtual

Reimplemented from Unit.

10559{
10560 PacketCooldowns cooldowns;
10561 WorldPacket data;
10562
10563 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
10564 {
10565 if (itr->second->State == PLAYERSPELL_REMOVED)
10566 continue;
10567 uint32 unSpellId = itr->first;
10568 SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(unSpellId);
10569
10570 // Not send cooldown for this spells
10571 if (spellInfo->IsCooldownStartedOnEvent())
10572 continue;
10573
10575 continue;
10576
10577 if ((idSchoolMask & spellInfo->GetSchoolMask()) && GetSpellCooldownDelay(unSpellId) < unTimeMs)
10578 {
10579 cooldowns[unSpellId] = unTimeMs;
10580 AddSpellCooldown(unSpellId, 0, unTimeMs, true);
10581 }
10582 }
10583
10584 if (!cooldowns.empty())
10585 {
10587 SendDirectMessage(&data);
10588 }
10589}
@ SPELL_PREVENTION_TYPE_SILENCE
Definition SharedDefines.h:1565
uint32 PreventionType
Definition SpellInfo.h:390
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1998

References AddSpellCooldown(), Unit::BuildCooldownPacket(), SpellInfo::GetSchoolMask(), GetSpellCooldownDelay(), SpellInfo::IsCooldownStartedOnEvent(), m_spells, PLAYERSPELL_REMOVED, SpellInfo::PreventionType, SendDirectMessage(), SPELL_COOLDOWN_FLAG_NONE, SPELL_PREVENTION_TYPE_SILENCE, and sSpellMgr.

◆ QuickEquipItem()

void Player::QuickEquipItem ( uint16  pos,
Item pItem 
)
2836{
2837 if (pItem)
2838 {
2840 AddItemDurations(pItem);
2841
2842 uint8 slot = pos & 255;
2843 VisualizeItem(slot, pItem);
2844
2845 if (IsInWorld())
2846 {
2847 pItem->AddToWorld();
2848 pItem->SendUpdateToPlayer(this);
2849 }
2850
2853
2854 sScriptMgr->OnPlayerEquip(this, pItem, (pos >> 8), slot, true);
2855 }
2856}

References ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, AddEnchantmentDurations(), AddItemDurations(), Object::AddToWorld(), Object::GetEntry(), Object::IsInWorld(), Object::SendUpdateToPlayer(), sScriptMgr, UpdateAchievementCriteria(), and VisualizeItem().

Referenced by _LoadInventory().

◆ RecalculateRating()

void Player::RecalculateRating ( CombatRating  cr)
inline
1959{ ApplyRatingMod(cr, 0, true);}

References ApplyRatingMod().

Referenced by DestroyItem(), EquipItem(), RemoveItem(), and UpdateAllStats().

◆ RefundItem()

void Player::RefundItem ( Item item)
private

Already checked before

15709{
15710 if (!item->IsRefundable())
15711 {
15712 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15713 return;
15714 }
15715
15716 if (item->IsRefundExpired()) // item refund has expired
15717 {
15718 item->SetNotRefundable(this);
15720 data << item->GetGUID(); // Guid
15721 data << uint32(10); // Error!
15722 SendDirectMessage(&data);
15723 return;
15724 }
15725
15726 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15727 {
15728 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15729 item->SetNotRefundable(this);
15730 return;
15731 }
15732
15733 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15734 if (!iece)
15735 {
15736 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15737 return;
15738 }
15739
15740 bool store_error = false;
15741 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15742 {
15743 uint32 count = iece->reqitemcount[i];
15744 uint32 itemid = iece->reqitem[i];
15745
15746 if (count && itemid)
15747 {
15748 ItemPosCountVec dest;
15749 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15750 if (msg != EQUIP_ERR_OK)
15751 {
15752 store_error = true;
15753 break;
15754 }
15755 }
15756 }
15757
15758 if (store_error)
15759 {
15761 data << item->GetGUID(); // Guid
15762 data << uint32(10); // Error!
15763 SendDirectMessage(&data);
15764 return;
15765 }
15766
15767 WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
15768 data << item->GetGUID(); // item guid
15769 data << uint32(0); // 0, or error code
15770 data << uint32(item->GetPaidMoney()); // money cost
15771 data << uint32(iece->reqhonorpoints); // honor point cost
15772 data << uint32(iece->reqarenapoints); // arena point cost
15773 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15774 {
15775 data << uint32(iece->reqitem[i]);
15776 data << uint32(iece->reqitemcount[i]);
15777 }
15778 SendDirectMessage(&data);
15779
15780 uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
15781
15782 // Save all relevant data to DB to prevent desynchronisation exploits
15783 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
15784
15785 // Delete any references to the refund data
15786 item->SetNotRefundable(this, true, &trans);
15787
15788 // Destroy item
15789 DestroyItem(item->GetBagSlot(), item->GetSlot(), true);
15790
15791 // Grant back extendedcost items
15792 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i)
15793 {
15794 uint32 count = iece->reqitemcount[i];
15795 uint32 itemid = iece->reqitem[i];
15796 if (count && itemid)
15797 {
15798 ItemPosCountVec dest;
15799 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemid, count);
15800 ASSERT(msg == EQUIP_ERR_OK);
15801 Item* it = StoreNewItem(dest, itemid, true);
15802 SendNewItem(it, count, true, false, true);
15803 }
15804 }
15805
15806 // Grant back money
15807 if (moneyRefund)
15808 ModifyMoney(moneyRefund); // Saved in SaveInventoryAndGoldToDB
15809
15810 // Grant back Honor points
15811 if (uint32 honorRefund = iece->reqhonorpoints)
15812 ModifyHonorPoints(honorRefund, trans);
15813
15814 // Grant back Arena points
15815 if (uint32 arenaRefund = iece->reqarenapoints)
15816 ModifyArenaPoints(arenaRefund, trans);
15817
15819
15820 CharacterDatabase.CommitTransaction(trans);
15821}
uint32 GetPaidExtendedCost()
Definition Item.h:349
uint32 GetPaidMoney()
Definition Item.h:348
ObjectGuid::LowType GetRefundRecipient()
Definition Item.h:347
bool IsRefundExpired()
Definition Item.cpp:1253
void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7134
@ SMSG_ITEM_REFUND_RESULT
Definition Opcodes.h:1235

References ASSERT, CanStoreNewItem(), CharacterDatabase, DestroyItem(), EQUIP_ERR_OK, Item::GetBagSlot(), Object::GetGUID(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetRefundRecipient(), Item::GetSlot(), Item::IsRefundable(), Item::IsRefundExpired(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ModifyArenaPoints(), ModifyHonorPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, SaveInventoryAndGoldToDB(), SendDirectMessage(), SendNewItem(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_RESULT, and StoreNewItem().

Referenced by WorldSession::HandleItemRefund().

◆ Regenerate()

void Player::Regenerate ( Powers  power)
Todo:
: possible use of miscvalueb instead of amount
1837{
1838 uint32 maxValue = GetMaxPower(power);
1839 if (!maxValue)
1840 return;
1841
1842 //If .cheat power is on always have the max power
1844 {
1845 if (m_regenTimerCount >= 2000)
1846 {
1847 //Set the value to 0 first then set it to max to force resend of packet as for range clients keeps removing rage
1848 if (power == POWER_RAGE || power == POWER_RUNIC_POWER)
1849 {
1850 UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, 0);
1851 }
1852
1853 SetPower(power, maxValue);
1854 return;
1855 }
1856 }
1857
1858 uint32 curValue = GetPower(power);
1859
1862 return;
1863
1864 float addvalue = 0.0f;
1865
1866 switch (power)
1867 {
1868 case POWER_MANA:
1869 {
1870 bool recentCast = IsUnderLastManaUseEffect();
1871 float ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA);
1872
1873 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1874 ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
1875
1876 if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
1878 else
1880 }
1881 break;
1882 case POWER_RAGE: // Regenerate rage
1883 {
1884 if (!IsInCombat() && !HasInterruptRegenAura())
1885 {
1886 float RageDecreaseRate = sWorld->getRate(RATE_POWER_RAGE_LOSS);
1887 addvalue += -20 * RageDecreaseRate; // 2 rage by tick (= 2 seconds => 1 rage/sec)
1888 }
1889 }
1890 break;
1891 case POWER_ENERGY: // Regenerate energy (rogue)
1892 // Regen per second
1894 // Regen per millisecond
1895 addvalue *= 0.001f;
1896 // Milliseconds passed
1897 addvalue *= m_regenTimer;
1898 // Rate
1899 addvalue *= sWorld->getRate(RATE_POWER_ENERGY);
1900 break;
1901 case POWER_RUNIC_POWER:
1902 {
1903 if (!IsInCombat() && !HasInterruptRegenAura())
1904 {
1905 float RunicPowerDecreaseRate = sWorld->getRate(RATE_POWER_RUNICPOWER_LOSS);
1906 addvalue += -30 * RunicPowerDecreaseRate; // 3 RunicPower by tick
1907 }
1908 }
1909 break;
1910 case POWER_RUNE:
1911 case POWER_FOCUS:
1912 case POWER_HAPPINESS:
1913 break;
1914 case POWER_HEALTH:
1915 return;
1916 default:
1917 break;
1918 }
1919
1920 // Mana regen calculated in Player::UpdateManaRegen(), energy regen calculated in Player::UpdateEnergyRegen()
1921 if (power != POWER_MANA && power != POWER_ENERGY)
1922 {
1924 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
1925 if (Powers((*i)->GetMiscValue()) == power)
1926 AddPct(addvalue, (*i)->GetAmount());
1927
1928 // Butchery requires combat for this effect
1929 if (power != POWER_RUNIC_POWER || IsInCombat())
1931 }
1932
1933 if (addvalue < 0.0f)
1934 {
1935 if (curValue == 0)
1936 return;
1937 }
1938 else if (addvalue > 0.0f)
1939 {
1940 if (curValue == maxValue)
1941 return;
1942 }
1943 else
1944 return;
1945
1946 addvalue += m_powerFraction[power];
1947 uint32 integerValue = uint32(std::fabs(addvalue));
1948
1949 if (addvalue < 0.0f)
1950 {
1951 if (curValue > integerValue)
1952 {
1953 curValue -= integerValue;
1954 m_powerFraction[power] = addvalue + integerValue;
1955 }
1956 else
1957 {
1958 curValue = 0;
1959 m_powerFraction[power] = 0;
1960 }
1961 }
1962 else
1963 {
1964 curValue += integerValue;
1965
1966 if (curValue >= maxValue)
1967 {
1968 curValue = maxValue;
1969 m_powerFraction[power] = 0;
1970 }
1971 else
1972 m_powerFraction[power] = addvalue - integerValue;
1973 }
1974
1975 if (m_regenTimerCount >= 2000 || curValue == 0 || curValue == maxValue)
1976 SetPower(power, curValue, true, true);
1977 else
1979}
@ CHEAT_POWER
Definition Player.h:997
@ POWER_HEALTH
Definition SharedDefines.h:289
@ SPELL_AURA_MOD_POWER_REGEN
Definition SpellAuraDefines.h:148
@ SPELL_AURA_PREVENT_REGENERATE_POWER
Definition SpellAuraDefines.h:357
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97
@ UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER
Definition UpdateFields.h:113
@ UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER
Definition UpdateFields.h:112
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:619
@ RATE_POWER_RAGE_LOSS
Definition WorldConfig.h:391
@ RATE_POWER_RUNICPOWER_LOSS
Definition WorldConfig.h:393
@ RATE_POWER_ENERGY
Definition WorldConfig.h:395
@ RATE_POWER_MANA
Definition WorldConfig.h:389
@ CONFIG_LOW_LEVEL_REGEN_BOOST
Definition WorldConfig.h:138
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:652
bool IsUnderLastManaUseEffect() const
Definition Unit.cpp:17269
bool HasInterruptRegenAura() const
Definition Unit.h:1764
bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const
Definition Unit.cpp:5820

References AddPct(), AsUnderlyingType(), CHEAT_POWER, CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), GetCommandStatus(), Object::GetFloatValue(), Unit::GetLevel(), Unit::GetMaxPower(), Unit::GetPower(), Unit::GetTotalAuraModifierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), Unit::HasInterruptRegenAura(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsUnderLastManaUseEffect(), m_powerFraction, Unit::m_regenTimer, m_regenTimerCount, POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, RATE_POWER_ENERGY, RATE_POWER_MANA, RATE_POWER_RAGE_LOSS, RATE_POWER_RUNICPOWER_LOSS, Unit::SetPower(), SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, sWorld, UNIT_FIELD_POWER1, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, and Object::UpdateUInt32Value().

Referenced by RegenerateAll().

◆ RegenerateAll()

void Player::RegenerateAll ( )
1754{
1755 //if (m_regenTimer <= 500)
1756 // return;
1757
1760
1762
1764
1765 // Runes act as cooldowns, and they don't need to send any data
1767 for (uint8 i = 0; i < MAX_RUNES; ++i)
1768 {
1769 // xinef: implement grace
1770 if (int32 cd = GetRuneCooldown(i))
1771 {
1772 SetRuneCooldown(i, (cd > m_regenTimer) ? cd - m_regenTimer : 0);
1773 // start grace counter, player must be in combat and rune has to go off cooldown
1774 if (IsInCombat() && cd <= m_regenTimer)
1775 SetGracePeriod(i, m_regenTimer - cd + 1); // added 1 because m_regenTimer-cd can be equal 0
1776 }
1777 // xinef: if grace is started, increase it but no more than cap
1778 else if (uint32 grace = GetGracePeriod(i))
1779 {
1780 if (grace < RUNE_GRACE_PERIOD)
1781 SetGracePeriod(i, std::min<uint32>(grace + m_regenTimer, RUNE_GRACE_PERIOD));
1782 }
1783 }
1784
1785 if (m_regenTimerCount >= 2000)
1786 {
1787 // Not in combat or they have regeneration
1791 {
1793 }
1794
1798
1799 m_regenTimerCount -= 2000;
1800 }
1801
1802 m_regenTimer = 0;
1803
1804 // Handles the emotes for drinking and eating.
1805 // According to sniffs there is a background timer going on that repeats independed from the time window where the aura applies.
1806 // That's why we dont need to reset the timer on apply. In sniffs I have seen that the first call for the spell visual is totally random, then after
1807 // 5 seconds over and over again which confirms my theory that we have a independed timer.
1808 if (m_foodEmoteTimerCount >= 5000)
1809 {
1810 std::vector<AuraEffect*> auraList;
1813
1814 auraList.reserve(ModRegenAuras.size() + ModPowerRegenAuras.size());
1815 auraList.insert(auraList.end(), ModRegenAuras.begin(), ModRegenAuras.end());
1816 auraList.insert(auraList.end(), ModPowerRegenAuras.begin(), ModPowerRegenAuras.end());
1817
1818 for (auto itr = auraList.begin(); itr != auraList.end(); ++itr)
1819 {
1820 // Food emote comes above drinking emote if we have to decide (mage regen food for example)
1821 if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1822 {
1824 break;
1825 }
1826 else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
1827 {
1829 break;
1830 }
1831 }
1832 m_foodEmoteTimerCount -= 5000;
1833 }
1834}
@ RUNE_GRACE_PERIOD
Definition Player.h:399
@ SPELL_VISUAL_KIT_DRINK
Definition SharedDefines.h:361
@ SPELL_VISUAL_KIT_FOOD
Definition SharedDefines.h:360
@ SPELL_AURA_MOD_REGEN
Definition SpellAuraDefines.h:147
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
void Regenerate(Powers power)
Definition Player.cpp:1836
void RegenerateHealth()
Definition Player.cpp:1981
bool IsPolymorphed() const
Definition Unit.cpp:16767
void SendPlaySpellVisual(uint32 id)
Definition Unit.cpp:18942
bool HasRegenDuringCombatAura() const
Definition Unit.h:1790
bool HasHealthRegenInCombatAura() const
Definition Unit.h:1789

References AURA_INTERRUPT_FLAG_NOT_SEATED, CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, Unit::GetAuraEffectsByType(), GetGracePeriod(), GetRuneCooldown(), Unit::HasHealthRegenInCombatAura(), Unit::HasRegenDuringCombatAura(), IsClass(), Unit::IsInCombat(), Unit::IsPolymorphed(), m_baseHealthRegen, m_foodEmoteTimerCount, Unit::m_regenTimer, m_regenTimerCount, MAX_RUNES, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, Regenerate(), RegenerateHealth(), RUNE_GRACE_PERIOD, Unit::SendPlaySpellVisual(), SetGracePeriod(), SetRuneCooldown(), SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_REGEN, SPELL_VISUAL_KIT_DRINK, and SPELL_VISUAL_KIT_FOOD.

Referenced by Update().

◆ RegenerateHealth()

void Player::RegenerateHealth ( )
1982{
1983 uint32 curValue = GetHealth();
1984 uint32 maxValue = GetMaxHealth();
1985
1986 if (curValue >= maxValue)
1987 return;
1988
1989 float HealthIncreaseRate = sWorld->getRate(RATE_HEALTH);
1990
1991 if (sWorld->getBoolConfig(CONFIG_LOW_LEVEL_REGEN_BOOST) && GetLevel() < 15)
1992 HealthIncreaseRate = sWorld->getRate(RATE_HEALTH) * (2.066f - (GetLevel() * 0.066f));
1993
1994 float addvalue = 0.0f;
1995
1996 // polymorphed case
1997 if (IsPolymorphed())
1998 addvalue = (float)GetMaxHealth() / 3;
1999 // normal regen case (maybe partly in combat case)
2000 else if (!IsInCombat() || HasRegenDuringCombatAura())
2001 {
2002 addvalue = OCTRegenHPPerSpirit() * HealthIncreaseRate;
2003
2004 if (!IsStandState())
2005 {
2006 addvalue *= 1.33f;
2007 }
2008
2010 for (AuraEffectList::const_iterator i = mModHealthRegenPct.begin(); i != mModHealthRegenPct.end(); ++i)
2011 {
2012 AddPct(addvalue, (*i)->GetAmount());
2013 }
2014
2015 if (!IsInCombat())
2016 {
2018 }
2019 else if (HasRegenDuringCombatAura())
2020 {
2022 }
2023 }
2024
2025 // always regeneration bonus (including combat)
2027 addvalue += m_baseHealthRegen / 2.5f;
2028
2029 if (addvalue < 0)
2030 addvalue = 0;
2031
2032 ModifyHealth(int32(addvalue));
2033}
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
Definition SpellAuraDefines.h:151
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224
T ApplyPct(T &base, U pct)
Definition Util.h:73
@ RATE_HEALTH
Definition WorldConfig.h:388
float OCTRegenHPPerSpirit()
Definition Player.cpp:5236
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14179
bool IsStandState() const
Definition Unit.cpp:16737

References AddPct(), ApplyPct(), CONFIG_LOW_LEVEL_REGEN_BOOST, Unit::GetAuraEffectsByType(), Unit::GetHealth(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetTotalAuraModifier(), Unit::HasRegenDuringCombatAura(), IN_MILLISECONDS, Unit::IsInCombat(), Unit::IsPolymorphed(), Unit::IsStandState(), m_baseHealthRegen, Unit::ModifyHealth(), OCTRegenHPPerSpirit(), RATE_HEALTH, SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT, SPELL_AURA_MOD_HEALTH_REGEN_PERCENT, SPELL_AURA_MOD_REGEN, SPELL_AURA_MOD_REGEN_DURING_COMBAT, and sWorld.

Referenced by RegenerateAll().

◆ removeActionButton()

void Player::removeActionButton ( uint8  button)
5657{
5658 ActionButtonList::iterator buttonItr = m_actionButtons.find(button);
5659 if (buttonItr == m_actionButtons.end() || buttonItr->second.uState == ACTIONBUTTON_DELETED)
5660 return;
5661
5662 if (buttonItr->second.uState == ACTIONBUTTON_NEW)
5663 m_actionButtons.erase(buttonItr); // new and not saved
5664 else
5665 buttonItr->second.uState = ACTIONBUTTON_DELETED; // saved, will deleted at next save
5666
5667 LOG_DEBUG("entities.player", "Action Button {} Removed from Player {}", button, GetGUID().ToString());
5668}

References ACTIONBUTTON_DELETED, ACTIONBUTTON_NEW, Object::GetGUID(), LOG_DEBUG, m_actionButtons, Position::ToString(), and ActionButton::uState.

Referenced by WorldSession::HandleSetActionButtonOpcode().

◆ RemoveActiveQuest()

void Player::RemoveActiveQuest ( uint32  questId,
bool  update = true 
)
1496{
1497 QuestStatusMap::iterator itr = m_QuestStatus.find(questId);
1498 if (itr != m_QuestStatus.end())
1499 {
1500 m_QuestStatus.erase(itr);
1501 m_QuestStatusSave[questId] = false;
1502 }
1503
1504 if (update)
1505 SendQuestUpdate(questId);
1506
1507 // Xinef: area auras may change on quest remove!
1511}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), WorldObject::GetAreaId(), WorldObject::GetZoneId(), m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), UpdateAreaDependentAuras(), and UpdateZoneDependentAuras().

Referenced by Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveAllSpellCooldown()

void Player::RemoveAllSpellCooldown ( )
3587{
3589 if (!m_spellCooldowns.empty())
3590 {
3591 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
3592 if (itr->second.end < infTime)
3593 SendClearCooldown(itr->first, this);
3594
3595 m_spellCooldowns.clear();
3596 }
3597}
void SendClearCooldown(uint32 spell_id, Unit *target)
Definition Player.cpp:14770

References GameTime::GetGameTimeMS(), infinityCooldownDelayCheck, m_spellCooldowns, and SendClearCooldown().

Referenced by misc_commandscript::HandleCooldownCommand().

◆ RemoveAmmo()

◆ RemoveArenaEnchantments()

void Player::RemoveArenaEnchantments ( EnchantmentSlot  slot)
4225{
4226 // remove enchantments from equipped items first to clean up the m_enchantDuration list
4227 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4228 {
4229 next = itr;
4230 if (itr->slot == slot)
4231 {
4232 if (itr->item && itr->item->GetEnchantmentId(slot))
4233 {
4234 // Poisons and DK runes are enchants which are allowed on arenas
4235 if (sSpellMgr->IsArenaAllowedEnchancment(itr->item->GetEnchantmentId(slot)))
4236 {
4237 ++next;
4238 continue;
4239 }
4240 // remove from stats
4241 ApplyEnchantment(itr->item, slot, false, false);
4242 // remove visual
4243 itr->item->ClearEnchantment(slot);
4244 }
4245 // remove from update list
4246 next = m_enchantDuration.erase(itr);
4247 }
4248 else
4249 ++next;
4250 }
4251
4252 // Xinef: check arena allowed enchantments :)
4253 // remove enchants from inventory items
4254 // NOTE: no need to remove these from stats, since these aren't equipped
4255 // in inventory
4257 if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
4258 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4259 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4260 pItem->ClearEnchantment(slot);
4261
4262 // in inventory bags
4264 if (Bag* pBag = GetBagByPos(i))
4265 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
4266 if (Item* pItem = pBag->GetItemByPos(j))
4267 if (uint32 enchId = pItem->GetEnchantmentId(slot))
4268 if (!sSpellMgr->IsArenaAllowedEnchancment(enchId))
4269 pItem->ClearEnchantment(slot);
4270}

References ApplyEnchantment(), GetBagByPos(), GetItemByPos(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, INVENTORY_SLOT_ITEM_END, INVENTORY_SLOT_ITEM_START, m_enchantDuration, and sSpellMgr.

Referenced by Battleground::AddPlayer().

◆ RemoveArenaSpellCooldowns()

void Player::RemoveArenaSpellCooldowns ( bool  removeActivePetCooldowns = false)
3552{
3553 // remove cooldowns on spells that have < 10 min CD
3555 SpellCooldowns::iterator itr, next;
3556 for (itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); itr = next)
3557 {
3558 next = itr;
3559 ++next;
3560 SpellInfo const* spellInfo = sSpellMgr->CheckSpellInfo(itr->first);
3561 if (!spellInfo)
3562 {
3563 continue;
3564 }
3565
3567 RemoveSpellCooldown(itr->first, true);
3568 else if (spellInfo->RecoveryTime < 10 * MINUTE * IN_MILLISECONDS && spellInfo->CategoryRecoveryTime < 10 * MINUTE * IN_MILLISECONDS && itr->second.end < infTime// xinef: dont remove active cooldowns - bugz
3569 && itr->second.maxduration < 10 * MINUTE * IN_MILLISECONDS) // xinef: dont clear cooldowns that have maxduration > 10 minutes (eg item cooldowns with no spell.dbc cooldown info)
3570 RemoveSpellCooldown(itr->first, true);
3571 }
3572
3573 // pet cooldowns
3574 if (removeActivePetCooldowns)
3575 if (Pet* pet = GetPet())
3576 {
3577 // notify player
3578 for (CreatureSpellCooldowns::const_iterator itr2 = pet->m_CreatureSpellCooldowns.begin(); itr2 != pet->m_CreatureSpellCooldowns.end(); ++itr2)
3579 SendClearCooldown(itr2->first, pet);
3580
3581 // actually clear cooldowns
3582 pet->m_CreatureSpellCooldowns.clear();
3583 }
3584}
@ SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS
Definition SharedDefines.h:558
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3535

References SpellInfo::CategoryRecoveryTime, GameTime::GetGameTimeMS(), GetPet(), SpellInfo::HasAttribute(), IN_MILLISECONDS, infinityCooldownDelayCheck, m_spellCooldowns, MINUTE, SpellInfo::RecoveryTime, RemoveSpellCooldown(), SendClearCooldown(), SPELL_ATTR4_IGNORE_DEFAULT_ARENA_RESTRICTIONS, and sSpellMgr.

Referenced by Battleground::AddPlayer().

◆ RemoveAtLoginFlag()

void Player::RemoveAtLoginFlag ( AtLoginFlags  flags,
bool  persist = false 
)
14756{
14757 m_atLoginFlags &= ~flags;
14758
14759 if (persist)
14760 {
14762
14763 stmt->SetData(0, uint16(flags));
14764 stmt->SetData(1, GetGUID().GetCounter());
14765
14766 CharacterDatabase.Execute(stmt);
14767 }
14768}
@ CHAR_UPD_REM_AT_LOGIN_FLAG
Definition CharacterDatabase.h:277

References CHAR_UPD_REM_AT_LOGIN_FLAG, CharacterDatabase, Object::GetGUID(), m_atLoginFlags, and PreparedStatementBase::SetData().

Referenced by WorldSession::HandlePlayerLoginFromDB(), LoadCorpse(), resetSpells(), Pet::resetTalents(), resetTalents(), and Pet::resetTalentsForAllPetsOf().

◆ RemoveBattlegroundQueueId()

void Player::RemoveBattlegroundQueueId ( BattlegroundQueueTypeId  val)
12319{
12320 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12321 {
12322 if (_BgBattlegroundQueueID[i].bgQueueTypeId == val)
12323 {
12325 _BgBattlegroundQueueID[i].invitedToInstance = 0;
12326 return;
12327 }
12328 }
12329}

References _BgBattlegroundQueueID, BATTLEGROUND_QUEUE_NONE, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BGQueueRemoveEvent::Execute(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::LogoutPlayer(), and Battleground::RemovePlayerAtLeave().

◆ RemoveBonusTalent()

void Player::RemoveBonusTalent ( uint32  count)
inline
1732{ m_extraBonusTalentCount -= count; };

References m_extraBonusTalentCount.

◆ RemoveCategoryCooldown()

void Player::RemoveCategoryCooldown ( uint32  cat)
3544{
3545 SpellCategoryStore::const_iterator i_scstore = sSpellsByCategoryStore.find(cat);
3546 if (i_scstore != sSpellsByCategoryStore.end())
3547 for (SpellCategorySet::const_iterator i_scset = i_scstore->second.begin(); i_scset != i_scstore->second.end(); ++i_scset)
3548 RemoveSpellCooldown(i_scset->second, true);
3549}

References RemoveSpellCooldown(), and sSpellsByCategoryStore.

Referenced by spell_hun_readiness::HandleDummy(), spell_item_refocus::HandleDummy(), and Unit::HandleProcTriggerSpell().

◆ RemoveCorpse()

void Player::RemoveCorpse ( )
4693{
4694 if (GetCorpse())
4695 {
4697 }
4698
4699 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4700 Corpse::DeleteFromDB(GetGUID(), trans);
4701 CharacterDatabase.CommitTransaction(trans);
4702
4704}
void RemoveFromWorld() override
Definition Corpse.cpp:52

References _corpseLocation, CharacterDatabase, Corpse::DeleteFromDB(), GetCorpse(), Object::GetGUID(), Corpse::RemoveFromWorld(), and WorldLocation::WorldRelocate().

Referenced by WorldSession::HandleMoveWorldportAck().

◆ RemovedInsignia()

void Player::RemovedInsignia ( Player looterPlr)
7793{
7794 // Xinef: If player is not in battleground and not in wintergrasp
7796 return;
7797
7798 // If not released spirit, do it !
7799 if (m_deathTimer > 0)
7800 {
7801 m_deathTimer = 0;
7804 }
7805
7807
7808 // We have to convert player corpse to bones, not to be able to resurrect there
7809 // SpawnCorpseBones isn't handy, 'cos it saves player while he in BG
7810 Corpse* bones = GetMap()->ConvertCorpseToBones(GetGUID(), true);
7811 if (!bones)
7812 return;
7813
7814 // Now we must make bones lootable, and send player loot
7816
7817 // We store the level of our player in the gold field
7818 // We retrieve this information at Player::SendLoot()
7819 bones->loot.gold = GetLevel();
7820 bones->lootRecipient = looterPlr;
7821 looterPlr->SendLoot(bones->GetGUID(), LOOT_INSIGNIA);
7822}
@ AREA_WINTERGRASP
Definition AreaDefines.h:144
@ LOOT_INSIGNIA
Definition LootMgr.h:90
@ CORPSE_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3383
@ CORPSE_FIELD_DYNAMIC_FLAGS
Definition UpdateFields.h:428
Player * lootRecipient
Definition Corpse.h:78
Loot loot
Definition Corpse.h:77
Corpse * ConvertCorpseToBones(ObjectGuid const &ownerGuid, bool insignia=false)
Definition Map.cpp:2673
void SendLoot(ObjectGuid guid, LootType loot_type)
Definition Player.cpp:7831
void BuildPlayerRepop()
Definition Player.cpp:4438
uint32 gold
Definition LootMgr.h:322

References _corpseLocation, AREA_WINTERGRASP, BuildPlayerRepop(), Map::ConvertCorpseToBones(), CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, GetBattlegroundId(), Object::GetGUID(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), WorldObject::GetZoneId(), Loot::gold, Corpse::loot, LOOT_INSIGNIA, Corpse::lootRecipient, m_deathTimer, RepopAtGraveyard(), SendLoot(), Object::SetFlag(), and WorldLocation::WorldRelocate().

Referenced by Spell::EffectSkinPlayerCorpse().

◆ RemoveEnchantmentDurations()

void Player::RemoveEnchantmentDurations ( Item item)
4199{
4200 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4201 {
4202 if (itr->item == item)
4203 {
4204 // save duration in item
4205 item->SetEnchantmentDuration(EnchantmentSlot(itr->slot), itr->leftduration, this);
4206 itr = m_enchantDuration.erase(itr);
4207 }
4208 else
4209 ++itr;
4210 }
4211}
void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration, Player *owner)
Definition Item.cpp:941

References m_enchantDuration, and Item::SetEnchantmentDuration().

Referenced by _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveEnchantmentDurationsReferences()

void Player::RemoveEnchantmentDurationsReferences ( Item item)
4214{
4215 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end();)
4216 {
4217 if (itr->item == item)
4218 itr = m_enchantDuration.erase(itr);
4219 else
4220 ++itr;
4221 }
4222}

References m_enchantDuration.

Referenced by _SaveInventory().

◆ RemoveFromBattlegroundOrBattlefieldRaid()

void Player::RemoveFromBattlegroundOrBattlefieldRaid ( )
13148{
13149 //remove existing reference
13150 m_group.unlink();
13151 if (Group* group = GetOriginalGroup())
13152 {
13153 m_group.link(group, this);
13155 }
13156 SetOriginalGroup(nullptr);
13157}
void setSubGroup(uint8 pSubGroup)
Definition GroupReference.h:39
void SetOriginalGroup(Group *group, int8 subgroup=-1)
Definition Player.cpp:13159
Group * GetOriginalGroup()
Definition Player.h:2487
uint8 GetOriginalSubGroup() const
Definition Player.h:2489
void unlink()
Definition Reference.h:62
void link(TO *toObj, FROM *fromObj)
Definition Reference.h:45

References GetOriginalGroup(), GetOriginalSubGroup(), Reference< TO, FROM >::link(), m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::Disband(), and Group::RemoveMember().

◆ RemoveFromGroup() [1/2]

void Player::RemoveFromGroup ( Group group,
ObjectGuid  guid,
RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT,
ObjectGuid  kicker = ObjectGuid::Empty,
const char *  reason = nullptr 
)
static
2343{
2344 if (group)
2345 {
2346 group->RemoveMember(guid, method, kicker, reason);
2347 group = nullptr;
2348 }
2349}
bool RemoveMember(ObjectGuid guid, const RemoveMethod &method=GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker=ObjectGuid::Empty, const char *reason=nullptr)
Definition Group.cpp:546

References Group::RemoveMember().

Referenced by DeleteFromDB(), WorldSession::HandleGroupDisbandOpcode(), WorldSession::HandleGroupUninviteGuidOpcode(), WorldSession::HandleGroupUninviteOpcode(), WorldSession::LogoutPlayer(), and lfg::LFGMgr::UpdateBoot().

◆ RemoveFromGroup() [2/2]

void Player::RemoveFromGroup ( RemoveMethod  method = GROUP_REMOVEMETHOD_DEFAULT)
inline
1884{ RemoveFromGroup(GetGroup(), GetGUID(), method); }

References GetGroup(), Object::GetGUID(), and RemoveFromGroup().

Referenced by RemoveFromGroup().

◆ RemoveFromWhisperWhiteList()

void Player::RemoveFromWhisperWhiteList ( ObjectGuid  guid)
inline
2567{ WhisperList.remove(guid); }

References WhisperList.

Referenced by message_commandscript::HandleWhispersCommand().

◆ RemoveFromWorld()

void Player::RemoveFromWorld ( )
overridevirtual
  • Release charmed creatures, unsummon totems and remove pets/guardians
  • Do not add/remove the player from the object storage
  • It will crash when updating the ObjectAccessor
  • The player should only be removed when logging out

Reimplemented from Object.

1711{
1712 // cleanup
1713 if (IsInWorld())
1714 {
1719 ClearComboPoints(); // pussywizard: crashfix
1720 ClearComboPointHolders(); // pussywizard: crashfix
1721 if (ObjectGuid lguid = GetLootGUID()) // pussywizard: crashfix
1722 m_session->DoLootRelease(lguid);
1723 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1724 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1725 sWorldState->HandlePlayerLeaveZone(this, static_cast<AreaTableIDs>(m_zoneUpdateId));
1726 }
1727
1728 // Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
1729 for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
1730 {
1731 if (m_items[i])
1733 }
1734
1735 for (ItemMap::iterator iter = mMitems.begin(); iter != mMitems.end(); ++iter)
1736 iter->second->RemoveFromWorld();
1737
1742
1743 if (m_uint32Values)
1744 {
1745 if (WorldObject* viewpoint = GetViewpoint())
1746 {
1747 LOG_FATAL("entities.player", "Player {} has viewpoint {} {} when removed from world", GetName(), viewpoint->GetEntry(), viewpoint->GetTypeId());
1748 SetViewpoint(viewpoint, false);
1749 }
1750 }
1751}
AreaTableIDs
Definition AreaDefines.h:24
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
#define sWorldState
Definition WorldState.h:377
void SetViewpoint(WorldObject *target, bool apply)
Definition Player.cpp:13216
void UnsummonPetTemporaryIfAny()
Definition Player.cpp:14267
WorldObject * GetViewpoint() const
Definition Player.cpp:13259
void ClearComboPointHolders()
Definition Unit.cpp:16945
void RemoveFromWorld() override
Definition Unit.cpp:15711
void DoLootRelease(ObjectGuid lguid)
Definition LootHandler.cpp:270

References Unit::ClearComboPointHolders(), Unit::ClearComboPoints(), WorldSession::DoLootRelease(), GetLootGUID(), WorldObject::GetName(), GetViewpoint(), Object::IsInWorld(), LOG_FATAL, m_items, m_session, Object::m_uint32Values, m_zoneUpdateId, mMitems, PLAYER_SLOT_END, PLAYER_SLOT_START, Object::RemoveFromWorld(), Unit::RemoveFromWorld(), sBattlefieldMgr, SetViewpoint(), sOutdoorPvPMgr, StopCastingBindSight(), StopCastingCharm(), sWorldState, and UnsummonPetTemporaryIfAny().

Referenced by Map::RemovePlayerFromMap().

◆ RemoveItem()

void Player::RemoveItem ( uint8  bag,
uint8  slot,
bool  update,
bool  swap = false 
)
2900{
2901 // note: removeitem does not actually change the item
2902 // it only takes the item out of storage temporarily
2903 // note2: if removeitem is to be used for delinking
2904 // the item must be removed from the player's updatequeue
2905
2906 Item* pItem = GetItemByPos(bag, slot);
2907 if (pItem)
2908 {
2909 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItem bag = {}, slot = {}, item = {}", bag, slot, pItem->GetEntry());
2910
2912 RemoveItemDurations(pItem);
2913 RemoveTradeableItem(pItem);
2914 ApplyItemObtainSpells(pItem, false);
2915
2916 if (bag == INVENTORY_SLOT_BAG_0)
2917 {
2918 if (slot < INVENTORY_SLOT_BAG_END)
2919 {
2920 ItemTemplate const* pProto = pItem->GetTemplate();
2921 // item set bonuses applied only at equip and removed at unequip, and still active for broken items
2922
2923 if (pProto && pProto->ItemSet)
2924 RemoveItemsSetItem(this, pProto);
2925
2926 _ApplyItemMods(pItem, slot, false);
2927 }
2928
2929 m_items[slot] = nullptr;
2930
2931 // remove item dependent auras and casts (only weapon and armor slots)
2932 if (slot < INVENTORY_SLOT_BAG_END && slot < EQUIPMENT_SLOT_END)
2933 {
2934 // Xinef: Ensure that this function is called for places with swap=true
2935 if (!swap)
2936 {
2938 }
2939
2940 // remove held enchantments, update expertise
2941 if (slot == EQUIPMENT_SLOT_MAINHAND)
2942 {
2944 }
2945 else if (slot == EQUIPMENT_SLOT_OFFHAND)
2946 {
2948 }
2949
2950 // update armor penetration - passive auras may need it
2951 switch (slot)
2952 {
2957 default:
2958 break;
2959 }
2960 }
2961
2963
2964 if (slot < EQUIPMENT_SLOT_END)
2965 SetVisibleItemSlot(slot, nullptr);
2966 }
2967 else if (Bag* pBag = GetBagByPos(bag))
2968 pBag->RemoveItem(slot, update);
2969
2971 // pItem->SetGuidValue(ITEM_FIELD_OWNER, ObjectGuid::Empty); not clear owner at remove (it will be set at store). This used in mail and auction code
2972 pItem->SetSlot(NULL_SLOT);
2973 if (IsInWorld() && update)
2974 pItem->SendUpdateToPlayer(this);
2975 }
2976}

References _ApplyItemMods(), ApplyItemObtainSpells(), BASE_ATTACK, CR_ARMOR_PENETRATION, ObjectGuid::Empty, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, GetBagByPos(), Object::GetEntry(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, Object::IsInWorld(), ITEM_FIELD_CONTAINED, ItemTemplate::ItemSet, LOG_DEBUG, m_items, NULL_SLOT, OFF_ATTACK, PLAYER_FIELD_INV_SLOT_HEAD, RecalculateRating(), RemoveEnchantmentDurations(), RemoveItemDependentAurasAndCasts(), RemoveItemDurations(), RemoveItemsSetItem(), RemoveTradeableItem(), Object::SendUpdateToPlayer(), Object::SetGuidValue(), Item::SetSlot(), SetVisibleItemSlot(), and UpdateExpertise().

Referenced by AutoUnequipOffhandIfNeed(), Create(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleSellItemOpcode(), MoveItemFromInventory(), and SwapItem().

◆ RemoveItemDependentAurasAndCasts()

void Player::RemoveItemDependentAurasAndCasts ( Item pItem)
12631{
12632 for (AuraMap::iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end();)
12633 {
12634 Aura* aura = itr->second;
12635
12636 // skip passive (passive item dependent spells work in another way) and not self applied auras
12637 SpellInfo const* spellInfo = aura->GetSpellInfo();
12638 if (aura->IsPassive() || aura->GetCasterGUID() != GetGUID())
12639 {
12640 ++itr;
12641 continue;
12642 }
12643
12644 // skip if not item dependent or have alternative item
12645 if (HasItemFitToSpellRequirements(spellInfo, pItem))
12646 {
12647 ++itr;
12648 continue;
12649 }
12650
12651 // no alt item, remove aura, restart check
12652 RemoveOwnedAura(itr);
12653 }
12654
12655 // currently casted spells can be dependent from item
12656 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
12657 if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
12658 if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem))
12660}
@ SPELL_STATE_DELAYED
Definition Spell.h:239
#define CURRENT_MAX_SPELL
Definition Unit.h:546
bool HasItemFitToSpellRequirements(SpellInfo const *spellInfo, Item const *ignoreItem=nullptr) const
Definition Player.cpp:12568

References CURRENT_MAX_SPELL, Aura::GetCasterGUID(), Unit::GetCurrentSpell(), Object::GetGUID(), Aura::GetSpellInfo(), HasItemFitToSpellRequirements(), Unit::InterruptSpell(), Aura::IsPassive(), Unit::m_ownedAuras, Unit::RemoveOwnedAura(), and SPELL_STATE_DELAYED.

Referenced by DestroyItem(), WorldSession::HandleAutoEquipItemOpcode(), RemoveItem(), and SwapItem().

◆ RemoveItemDurations()

void Player::RemoveItemDurations ( Item item)
12493{
12494 for (ItemDurationList::iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
12495 {
12496 if (*itr == item)
12497 {
12498 m_itemDuration.erase(itr);
12499 break;
12500 }
12501 }
12502}

References m_itemDuration.

Referenced by _SaveInventory(), _StoreItem(), DestroyItem(), EquipItem(), and RemoveItem().

◆ RemoveItemFromBuyBackSlot()

void Player::RemoveItemFromBuyBackSlot ( uint32  slot,
bool  del 
)
3995{
3996 LOG_DEBUG("entities.player.items", "STORAGE: RemoveItemFromBuyBackSlot slot = {}", slot);
3997 if (slot >= BUYBACK_SLOT_START && slot < BUYBACK_SLOT_END)
3998 {
3999 Item* pItem = m_items[slot];
4000 if (pItem)
4001 {
4002 pItem->RemoveFromWorld();
4003 if (del)
4004 pItem->SetState(ITEM_REMOVED, this);
4005 }
4006
4007 m_items[slot] = nullptr;
4008
4009 uint32 eslot = slot - BUYBACK_SLOT_START;
4013
4014 // if current backslot is filled set to now free slot
4016 m_currentBuybackSlot = slot;
4017 }
4018}

References BUYBACK_SLOT_END, BUYBACK_SLOT_START, ObjectGuid::Empty, ITEM_REMOVED, LOG_DEBUG, m_currentBuybackSlot, m_items, PLAYER_FIELD_BUYBACK_PRICE_1, PLAYER_FIELD_BUYBACK_TIMESTAMP_1, PLAYER_FIELD_VENDORBUYBACK_SLOT_1, Object::RemoveFromWorld(), Object::SetGuidValue(), Item::SetState(), and Unit::SetUInt32Value().

Referenced by AddItemToBuyBackSlot(), WorldSession::HandleBuybackItem(), and reset_commandscript::ResetItemsInVendorBuyBackTab().

◆ RemoveMail()

void Player::RemoveMail ( uint32  id)
2848{
2849 for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
2850 {
2851 if ((*itr)->messageID == id)
2852 {
2853 //do not delete item, because Player::removeMail() is called when returning mail to sender.
2854 m_mail.erase(itr);
2855 return;
2856 }
2857 }
2858}

References m_mail.

Referenced by WorldSession::HandleMailReturnToSender().

◆ RemoveMItem()

bool Player::RemoveMItem ( ObjectGuid::LowType  itemLowGuid)
inline
1676 {
1677 return mMitems.erase(itemLowGuid);
1678 }

References mMitems.

Referenced by WorldSession::HandleMailReturnToSender(), and WorldSession::HandleMailTakeItem().

◆ RemovePet()

void Player::RemovePet ( Pet pet,
PetSaveMode  mode,
bool  returnreagent = false 
)
9128{
9129 if (!pet)
9130 pet = GetPet();
9131
9132 if (pet)
9133 {
9134 // xinef: dont save dead pet as current, save him not in slot
9135 if (!pet->IsAlive() && mode == PET_SAVE_AS_CURRENT && pet->getPetType() == HUNTER_PET)
9136 {
9137 mode = PET_SAVE_NOT_IN_SLOT;
9139 }
9140
9141 LOG_DEBUG("entities.pet", "RemovePet {}, {}, {}", pet->GetEntry(), mode, returnreagent);
9142 if (pet->m_removed)
9143 return;
9144 }
9145
9146 if (returnreagent && (pet || (m_temporaryUnsummonedPetNumber && (!m_session || !m_session->PlayerLogout()))) && !InBattleground())
9147 {
9148 //returning of reagents only for players, so best done here
9150 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9151
9152 if (spellInfo)
9153 {
9154 for (uint32 i = 0; i < MAX_SPELL_REAGENTS; ++i)
9155 {
9156 if (spellInfo->Reagent[i] > 0)
9157 {
9158 ItemPosCountVec dest; //for succubus, voidwalker, felhunter and felguard credit soulshard when despawn reason other than death (out of range, logout)
9159 InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, spellInfo->Reagent[i], spellInfo->ReagentCount[i]);
9160 if (msg == EQUIP_ERR_OK)
9161 {
9162 Item* item = StoreNewItem(dest, spellInfo->Reagent[i], true);
9163 if (IsInWorld())
9164 SendNewItem(item, spellInfo->ReagentCount[i], true, false);
9165 }
9166 }
9167 }
9168 }
9170 }
9171
9172 if (!pet)
9173 {
9174 if (mode == PET_SAVE_NOT_IN_SLOT && m_petStable && m_petStable->CurrentPet)
9175 {
9176 // Handle removing pet while it is in "temporarily unsummoned" state, for example on mount
9178 stmt->SetData(0, PET_SAVE_NOT_IN_SLOT);
9179 stmt->SetData(1, GetGUID().GetCounter());
9180 stmt->SetData(2, m_petStable->CurrentPet->PetNumber);
9181 CharacterDatabase.Execute(stmt);
9182
9183 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9184 m_petStable->CurrentPet.reset();
9185 }
9186
9187 return;
9188 }
9189 else
9190 {
9191 pet->CombatStop();
9192
9193 // only if current pet in slot
9194 pet->SavePetToDB(mode);
9195
9196 if (m_petStable->CurrentPet && m_petStable->CurrentPet->PetNumber == pet->GetCharmInfo()->GetPetNumber())
9197 {
9198 if (mode == PET_SAVE_NOT_IN_SLOT)
9199 {
9200 m_petStable->UnslottedPets.push_back(std::move(*m_petStable->CurrentPet));
9201 m_petStable->CurrentPet.reset();
9202 }
9203 else if (mode == PET_SAVE_AS_DELETED)
9204 m_petStable->CurrentPet.reset();
9205 // else if (stable slots) handled in opcode handlers due to required swaps
9206 // else (current pet) doesnt need to do anything
9207 }
9208
9209 SetMinion(pet, false);
9210
9211 pet->AddObjectToRemoveList();
9212 pet->m_removed = true;
9213
9214 if (pet->isControlled())
9215 {
9217 data << uint64(0);
9218 SendDirectMessage(&data);
9219
9220 if (GetGroup())
9222 }
9223
9225 {
9228 }
9229 }
9230}
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
Definition CharacterDatabase.h:485
#define MAX_SPELL_REAGENTS
Definition DBCStructure.h:1640
@ GROUP_UPDATE_PET
Definition Group.h:120
@ PET_SAVE_AS_DELETED
Definition PetDefines.h:42
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
PetType getPetType() const
Definition Pet.h:52
bool isControlled() const
Definition Pet.h:54
bool m_removed
Definition Pet.h:142
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2478
std::array< int32, MAX_SPELL_REAGENTS > Reagent
Definition SpellInfo.h:373
std::array< uint32, MAX_SPELL_REAGENTS > ReagentCount
Definition SpellInfo.h:374
void AddObjectToRemoveList()
Definition Object.cpp:2151
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62
uint32 GetPetNumber() const
Definition CharmInfo.h:132

References WorldObject::AddObjectToRemoveList(), CanStoreNewItem(), CHAR_UPD_CHAR_PET_SLOT_BY_ID, CharacterDatabase, Unit::CombatStop(), EQUIP_ERR_OK, CreatureTemplate::family, WorldObject::FindMap(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetPet(), CharmInfo::GetPetNumber(), Pet::getPetType(), Object::GetUInt32Value(), GROUP_UPDATE_PET, HUNTER_PET, InBattleground(), Unit::IsAlive(), Pet::isControlled(), Object::IsInWorld(), LOG_DEBUG, m_oldpetspell, m_petStable, Pet::m_removed, m_session, m_temporaryUnsummonedPetNumber, MAX_SPELL_REAGENTS, NeedSendSpectatorData(), NULL_BAG, NULL_SLOT, PET_SAVE_AS_CURRENT, PET_SAVE_AS_DELETED, PET_SAVE_NOT_IN_SLOT, WorldSession::PlayerLogout(), SpellInfo::Reagent, SpellInfo::ReagentCount, Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), SendDirectMessage(), SendNewItem(), PreparedStatementBase::SetData(), SetGroupUpdateFlag(), Unit::SetMinion(), SMSG_PET_SPELLS, sSpellMgr, StoreNewItem(), and UNIT_CREATED_BY_SPELL.

Referenced by Spell::_cast(), ActivateSpec(), Spell::EffectSummonPet(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleUnstablePet(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Pet::Remove(), resetTalents(), setDeathState(), SummonPet(), UnsummonPetTemporaryIfAny(), and Update().

◆ RemovePetitionsAndSigns()

void Player::RemovePetitionsAndSigns ( ObjectGuid  guid,
uint32  type 
)
static
10139{
10140 SignatureContainer* signatureStore = sPetitionMgr->GetSignatureStore();
10141 for (SignatureContainer::iterator itr = signatureStore->begin(); itr != signatureStore->end(); ++itr)
10142 {
10143 SignatureMap::iterator signItr = itr->second.signatureMap.find(guid);
10144 if (signItr != itr->second.signatureMap.end())
10145 {
10146 Petition const* petition = sPetitionMgr->GetPetition(itr->first);
10147 if (!petition || (type != 10 && type != petition->petitionType))
10148 continue;
10149
10150 // erase this
10151 itr->second.signatureMap.erase(signItr);
10152
10153 // send update if charter owner in game
10155 if (owner)
10156 owner->GetSession()->SendPetitionQueryOpcode(petition->petitionGuid);
10157 }
10158 }
10159
10160 if (type == 10)
10161 {
10163 stmt->SetData(0, guid.GetCounter());
10164 CharacterDatabase.Execute(stmt);
10165 }
10166 else
10167 {
10169 stmt->SetData(0, guid.GetCounter());
10170 stmt->SetData(1, uint8(type));
10171 CharacterDatabase.Execute(stmt);
10172 }
10173
10174 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
10175 if (type == 10)
10176 {
10178 stmt->SetData(0, guid.GetCounter());
10179 trans->Append(stmt);
10180
10181 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER);
10182 stmt->SetData(0, guid.GetCounter());
10183 trans->Append(stmt);
10184
10185 // xinef: clear petition store
10186 sPetitionMgr->RemovePetitionByOwnerAndType(guid, 0);
10187 }
10188 else
10189 {
10191 stmt->SetData(0, guid.GetCounter());
10192 stmt->SetData(1, uint8(type));
10193 trans->Append(stmt);
10194
10196 stmt->SetData(0, guid.GetCounter());
10197 stmt->SetData(1, uint8(type));
10198 trans->Append(stmt);
10199
10200 // xinef: clear petition store
10201 sPetitionMgr->RemovePetitionByOwnerAndType(guid, uint8(type));
10202 }
10203 CharacterDatabase.CommitTransaction(trans);
10204}
@ CHAR_DEL_PETITION_SIGNATURE
Definition CharacterDatabase.h:237
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER
Definition CharacterDatabase.h:453
@ CHAR_DEL_ALL_PETITION_SIGNATURES
Definition CharacterDatabase.h:236
@ CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE
Definition CharacterDatabase.h:455
@ CHAR_DEL_PETITION_BY_OWNER
Definition CharacterDatabase.h:452
@ CHAR_DEL_PETITION_BY_OWNER_AND_TYPE
Definition CharacterDatabase.h:454
#define sPetitionMgr
Definition PetitionMgr.h:104
std::map< ObjectGuid, Signatures > SignatureContainer
Definition PetitionMgr.h:60
void SendPetitionQueryOpcode(ObjectGuid petitionguid)
Definition PetitionsHandler.cpp:282
Definition PetitionMgr.h:40
ObjectGuid petitionGuid
Definition PetitionMgr.h:42
ObjectGuid ownerGuid
Definition PetitionMgr.h:46
uint8 petitionType
Definition PetitionMgr.h:48

References CHAR_DEL_ALL_PETITION_SIGNATURES, CHAR_DEL_PETITION_BY_OWNER, CHAR_DEL_PETITION_BY_OWNER_AND_TYPE, CHAR_DEL_PETITION_SIGNATURE, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, CHAR_DEL_PETITION_SIGNATURE_BY_OWNER_AND_TYPE, CharacterDatabase, ObjectAccessor::FindConnectedPlayer(), ObjectGuid::GetCounter(), GetSession(), Petition::ownerGuid, Petition::petitionGuid, Petition::petitionType, WorldSession::SendPetitionQueryOpcode(), PreparedStatementBase::SetData(), and sPetitionMgr.

Referenced by Guild::AddMember(), ArenaTeam::AddMember(), and DeleteFromDB().

◆ RemovePlayerFlag()

◆ RemoveQuestSlotState()

void Player::RemoveQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ RemoveReceivedSpectatorResetFor()

void Player::RemoveReceivedSpectatorResetFor ( ObjectGuid  guid)
inline
2586{ m_receivedSpectatorResetFor.erase(guid); }

References m_receivedSpectatorResetFor.

◆ RemoveRestFlag()

void Player::RemoveRestFlag ( RestFlag  restFlag)
16181{
16182 uint32 oldRestMask = _restFlagMask;
16183 _restFlagMask &= ~restFlag;
16184
16185 if (oldRestMask && !_restFlagMask) // only remove flag/time on the last rest state remove
16186 {
16187 _restTime = 0;
16189 }
16190}

References _restFlagMask, _restTime, PLAYER_FLAGS_RESTING, and RemovePlayerFlag().

Referenced by Update(), UpdateArea(), and UpdateZone().

◆ RemoveRestState()

void Player::RemoveRestState ( )

◆ RemoveRewardedQuest()

void Player::RemoveRewardedQuest ( uint32  questId,
bool  update = true 
)
1514{
1515 RewardedQuestSet::iterator rewItr = m_RewardedQuests.find(questId);
1516 if (rewItr != m_RewardedQuests.end())
1517 {
1518 m_RewardedQuests.erase(rewItr);
1519 m_RewardedQuestsSave[questId] = false;
1520 }
1521
1522 if (update)
1523 SendQuestUpdate(questId);
1524}

References m_RewardedQuests, m_RewardedQuestsSave, and SendQuestUpdate().

Referenced by Spell::EffectQuestClear().

◆ RemoveRunesByAuraEffect()

void Player::RemoveRunesByAuraEffect ( AuraEffect const *  aura)
13434{
13435 for (uint8 i = 0; i < MAX_RUNES; ++i)
13436 {
13437 if (m_runes->runes[i].ConvertAura == aura)
13438 {
13439 ConvertRune(i, GetBaseRune(i));
13440 SetRuneConvertAura(i, nullptr);
13441 }
13442 }
13443}
AuraEffect const * ConvertAura
Definition Player.h:418

References RuneInfo::ConvertAura, ConvertRune(), GetBaseRune(), m_runes, MAX_RUNES, Runes::runes, and SetRuneConvertAura().

Referenced by AuraEffect::HandleAuraConvertRune(), Aura::HandleAuraSpecificMods(), and AuraEffect::HandlePeriodicDummyAuraTick().

◆ removeSpell()

void Player::removeSpell ( uint32  spellId,
uint8  removeSpecMask,
bool  onlyTemporary 
)
3345{
3346 PlayerSpellMap::iterator itr = m_spells.find(spell_id);
3347 if (itr == m_spells.end())
3348 return;
3349
3350 // pussywizard: nothing to do if already removed or not in specs of removeSpecMask
3351 if (itr->second->State == PLAYERSPELL_REMOVED || (itr->second->specMask & removeSpecMask) == 0)
3352 return;
3353
3354 // pussywizard: avoid any possible bugs
3355 if (onlyTemporary && itr->second->State != PLAYERSPELL_TEMPORARY)
3356 return;
3357
3358 // pussywizard: remove non-talent higher ranks (recursive)
3359 // pussywizard: do this at the beginning, not in the middle of removing!
3360 if (uint32 nextSpell = sSpellMgr->GetNextSpellInChain(spell_id))
3361 if (!GetTalentSpellPos(nextSpell))
3362 removeSpell(nextSpell, removeSpecMask, onlyTemporary);
3363
3364 // xinef: if current spell has talentcost, remove spells requiring this spell
3365 uint32 firstRankSpellId = sSpellMgr->GetFirstSpellInChain(spell_id);
3366 if (GetTalentSpellCost(firstRankSpellId))
3367 {
3368 SpellsRequiringSpellMapBounds spellsRequiringSpell = sSpellMgr->GetSpellsRequiringSpellBounds(firstRankSpellId);
3369 for (auto spellsItr = spellsRequiringSpell.first; spellsItr != spellsRequiringSpell.second; ++spellsItr)
3370 {
3371 removeSpell(spellsItr->second, removeSpecMask, onlyTemporary);
3372 }
3373 }
3374
3375 // pussywizard: re-search, it can be corrupted in prev loop
3376 itr = m_spells.find(spell_id);
3377 if (itr == m_spells.end())
3378 return;
3379
3380 itr->second->specMask = (((uint8)itr->second->specMask) & ~removeSpecMask); // pussywizard: update specMask in map
3381
3382 // pussywizard: some more conditions needed for spells like pyroblast (shouldn't be fully removed when not available in any spec, should stay in db with specMask = 0)
3383 if (GetTalentSpellCost(firstRankSpellId) == 0 && !sSpellMgr->IsAdditionalTalentSpell(firstRankSpellId) && itr->second->specMask == 0)
3384 {
3385 if (itr->second->State == PLAYERSPELL_NEW || itr->second->State == PLAYERSPELL_TEMPORARY)
3386 {
3387 delete itr->second;
3388 m_spells.erase(itr);
3389 }
3390 else
3391 itr->second->State = PLAYERSPELL_REMOVED;
3392 }
3393 else if (itr->second->State != PLAYERSPELL_NEW && itr->second->State != PLAYERSPELL_TEMPORARY)
3394 itr->second->State = PLAYERSPELL_CHANGED;
3395
3396 // xinef: this is used for talents and they are not removed in removeSpell function...
3397 // xinef: however ill leave this here just in case
3398 // pussywizard: remove owned aura obtained from currently removed spell
3399 RemoveOwnedAura(spell_id);
3400
3401 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell_id);
3402 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3403 {
3404 // pussywizard: remove pet auras
3405 if (PetAura const* petSpell = sSpellMgr->GetPetAura(spell_id, i))
3406 RemovePetAura(petSpell);
3407
3408 // pussywizard: remove all triggered auras
3409 if (spellInfo->Effects[i].TriggerSpell > 0)
3410 RemoveAurasDueToSpell(spellInfo->Effects[i].TriggerSpell);
3411 }
3412
3413 // pussywizard: update free primary prof points
3414 if (spellInfo->IsPrimaryProfessionFirstRank())
3415 {
3416 uint32 freeProfs = GetFreePrimaryProfessionPoints() + 1;
3417 if (freeProfs <= sWorld->getIntConfig(CONFIG_MAX_PRIMARY_TRADE_SKILL))
3418 SetFreePrimaryProfessions(freeProfs);
3419 }
3420
3421 // pussywizard: update 310 flyer
3422 if (Has310Flyer(false))
3423 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3424 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED && spellInfo->Effects[i].CalcValue() == 310)
3425 Has310Flyer(true, spell_id);
3426
3427 // pussywizard: remove dependent skill
3428 SpellLearnSkillNode const* spellLearnSkill = sSpellMgr->GetSpellLearnSkill(spell_id);
3429 if (spellLearnSkill)
3430 {
3431 uint32 prev_spell = sSpellMgr->GetPrevSpellInChain(spell_id);
3432
3433 if (!prev_spell) // pussywizard: first rank, remove skill
3434 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3435 else // pussywizard: search previous ranks
3436 {
3437 SpellLearnSkillNode const* prevSkill = sSpellMgr->GetSpellLearnSkill(prev_spell);
3438 while (!prevSkill && prev_spell)
3439 {
3440 prev_spell = sSpellMgr->GetPrevSpellInChain(prev_spell);
3441 prevSkill = sSpellMgr->GetSpellLearnSkill(sSpellMgr->GetFirstSpellInChain(prev_spell));
3442 }
3443
3444 if (!prevSkill) // pussywizard: not found prev skill setting, remove skill
3445 SetSkill(spellLearnSkill->skill, 0, 0, 0);
3446 else // pussywizard: set to prev skill setting values
3447 {
3448 uint32 skill_value = GetPureSkillValue(prevSkill->skill);
3449 uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill);
3450 uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue;
3451
3452 if (skill_value > prevSkill->value)
3453 skill_value = prevSkill->value;
3454 if (skill_max_value > new_skill_max_value)
3455 skill_max_value = new_skill_max_value;
3456
3457 SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value);
3458 }
3459 }
3460 }
3461 else
3462 {
3463 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spell_id);
3464 // most likely will never be used, haven't heard of cases where players unlearn a mount
3465 if (Has310Flyer(false) && spellInfo)
3466 {
3467 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first; _spell_idx != bounds.second; ++_spell_idx)
3468 {
3469 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(_spell_idx->second->SkillLine);
3470 if (!pSkill)
3471 continue;
3472
3473 if (_spell_idx->second->SkillLine == SKILL_MOUNTS)
3474 {
3475 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3476 {
3477 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED &&
3478 spellInfo->Effects[i].CalcValue() == 310)
3479 {
3480 Has310Flyer(true, spell_id); // with true as first argument its also used to set/remove the flag
3481 break;
3482 }
3483 }
3484 }
3485 }
3486 }
3487 }
3488
3489 // pussywizard: remove from spell book (can't be replaced by previous rank, because such spells can't be unlearnt)
3490 if (!onlyTemporary || ((!spellInfo->HasAttribute(SpellAttr0(SPELL_ATTR0_PASSIVE | SPELL_ATTR0_DO_NOT_DISPLAY)) || !spellInfo->HasAnyAura()) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL)))
3491 {
3492 sScriptMgr->OnPlayerForgotSpell(this, spell_id);
3493 SendLearnPacket(spell_id, false);
3494 }
3495}

References CONFIG_MAX_PRIMARY_TRADE_SKILL, SpellInfo::Effects, GetFreePrimaryProfessionPoints(), GetMaxSkillValueForLevel(), GetPureMaxSkillValue(), GetPureSkillValue(), GetTalentSpellCost(), GetTalentSpellPos(), Has310Flyer(), SpellInfo::HasAnyAura(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), SpellInfo::IsPrimaryProfessionFirstRank(), m_spells, MAX_SPELL_EFFECTS, SpellLearnSkillNode::maxvalue, PLAYERSPELL_CHANGED, PLAYERSPELL_NEW, PLAYERSPELL_REMOVED, PLAYERSPELL_TEMPORARY, Unit::RemoveAurasDueToSpell(), Unit::RemoveOwnedAura(), Unit::RemovePetAura(), removeSpell(), SendLearnPacket(), SetFreePrimaryProfessions(), SetSkill(), SpellLearnSkillNode::skill, SKILL_MOUNTS, SPELL_ATTR0_DO_NOT_DISPLAY, SPELL_ATTR0_PASSIVE, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSkillLineStore, sSpellMgr, SpellLearnSkillNode::step, and SpellLearnSkillNode::value.

Referenced by _LoadSpells(), _removeTalentAurasAndSpells(), Spell::EffectUnlearnSpecialization(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraOverrideSpells(), Acore::PlayerCommand::HandleUnlearnSpellCommand(), learnSkillRewardedSpells(), ProfessionUnlearnSpells(), removeSpell(), resetSpells(), resetTalents(), and SetSkill().

◆ RemoveSpellCooldown()

◆ RemoveSpellMods()

void Player::RemoveSpellMods ( Spell spell)
10030{
10031 if (!spell)
10032 return;
10033
10034 if (spell->m_appliedMods.empty())
10035 return;
10036
10037 SpellInfo const* const spellInfo = spell->m_spellInfo;
10038
10039 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
10040 {
10041 for (SpellModList::const_iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end();)
10042 {
10043 SpellModifier* mod = *itr;
10044 ++itr;
10045
10046 // don't handle spells with proc_event entry defined
10047 // this is a temporary workaround, because all spellmods should be handled like that
10048 if (sSpellMgr->GetSpellProcEvent(mod->spellId))
10049 {
10050 continue;
10051 }
10052
10053 // spellmods without aura set cannot be charged
10054 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
10055 continue;
10056
10057 // check if mod affected this spell
10058 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
10059 if (iterMod == spell->m_appliedMods.end())
10060 continue;
10061
10062 // remove from list
10063 // leave this here, if spell have two mods it will remove 2 charges - wrong
10064 spell->m_appliedMods.erase(iterMod);
10065
10066 // MAGE T8P4 BONUS
10067 if (spellInfo->SpellFamilyName == SPELLFAMILY_MAGE)
10068 {
10069 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
10070 // Missile Barrage, Hot Streak, Brain Freeze (trigger spell - Fireball!)
10071 if (sp->SpellIconID == 3261 || sp->SpellIconID == 2999 || sp->SpellIconID == 2938)
10072 if (AuraEffect* aurEff = GetAuraEffectDummy(64869))
10073 if (roll_chance_i(aurEff->GetAmount()))
10074 {
10075 mod->charges = 1;
10076 continue;
10077 }
10078 }
10079 // ROGUE MUTILATE WITH COLD BLOOD
10080 if (spellInfo->Id == 5374)
10081 {
10082 SpellInfo const* sp = mod->ownerAura->GetSpellInfo();
10083 if (sp->Id == 14177) // Cold Blood
10084 {
10085 mod->charges = 1;
10086 continue;
10087 }
10088 }
10089
10091 itr = m_spellMods[i].begin();
10092 }
10093 }
10094}
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3797
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
#define MAX_SPELLMOD
Definition SpellDefines.h:109
bool IsUsingCharges() const
Definition SpellAuras.h:200
bool DropCharge(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.h:146
uint32 SpellIconID
Definition SpellInfo.h:380
SpellInfo const *const m_spellInfo
Definition Spell.h:531
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5618

References AURA_REMOVE_BY_EXPIRE, SpellModifier::charges, Aura::DropCharge(), Unit::GetAuraEffectDummy(), Aura::GetSpellInfo(), SpellInfo::Id, Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, MAX_SPELLMOD, SpellModifier::ownerAura, roll_chance_i(), SPELLFAMILY_MAGE, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SpellModifier::spellId, and sSpellMgr.

Referenced by Spell::_cast().

◆ RemoveTimedAchievement()

void Player::RemoveTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry 
)
13979{
13981}
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition AchievementMgr.cpp:2244

References m_achievementMgr, and AchievementMgr::RemoveTimedAchievement().

Referenced by InstanceScript::DoStopTimedAchievement(), and WorldSession::HandleQuestLogRemoveQuest().

◆ RemoveTimedQuest()

void Player::RemoveTimedQuest ( uint32  quest_id)
inline
1554{ m_timedquests.erase(quest_id); }

References m_timedquests.

Referenced by FailQuest(), WorldSession::HandleQuestLogRemoveQuest(), and RewardQuest().

◆ RemoveTradeableItem()

◆ ReplaceAllPlayerFlags()

void Player::ReplaceAllPlayerFlags ( PlayerFlags  flags)
inline
1113{ SetUInt32Value(PLAYER_FLAGS, flags); }

References PLAYER_FLAGS, and Unit::SetUInt32Value().

Referenced by LoadFromDB().

◆ RepopAtGraveyard()

void Player::RepopAtGraveyard ( )
4939{
4940 // note: this can be called also when the player is alive
4941 // for example from WorldSession::HandleMovementOpcodes
4942
4943 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId());
4944
4945 if (!sScriptMgr->OnPlayerCanRepopAtGraveyard(this))
4946 return;
4947
4948 // Such zones are considered unreachable as a ghost and the player must be automatically revived
4949 // Xinef: Get Transport Check is not needed
4950 if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) /*|| GetTransport()*/ || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4951 {
4952 ResurrectPlayer(0.5f);
4954 }
4955
4956 GraveyardStruct const* ClosestGrave = nullptr;
4957
4958 // Special handle for battleground maps
4959 if (Battleground* bg = GetBattleground())
4960 ClosestGrave = bg->GetClosestGraveyard(this);
4961 else
4962 {
4963 if (sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId()))
4964 ClosestGrave = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())->GetClosestGraveyard(this);
4965 else
4966 ClosestGrave = sGraveyard->GetClosestGraveyard(this, GetTeamId());
4967 }
4968
4969 // stop countdown until repop
4970 m_deathTimer = 0;
4971
4972 // if no grave found, stay at the current location
4973 // and don't show spirit healer location
4974 if (ClosestGrave)
4975 {
4976 TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation());
4977 if (isDead()) // not send if alive, because it used in TeleportTo()
4978 {
4979 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // show spirit healer position on minimap
4980 data << ClosestGrave->Map;
4981 data << ClosestGrave->x;
4982 data << ClosestGrave->y;
4983 data << ClosestGrave->z;
4984 SendDirectMessage(&data);
4985 }
4986 }
4987 else if (GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY()))
4989
4991}
@ AREA_FLAG_NEED_FLY
Definition DBCEnums.h:246
#define sGraveyard
Definition GameGraveyard.h:74
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:482
@ SMSG_DEATH_RELEASE_LOC
Definition Opcodes.h:918
Definition GameGraveyard.h:27
float z
Definition GameGraveyard.h:32
float x
Definition GameGraveyard.h:30
float y
Definition GameGraveyard.h:31
uint32 Map
Definition GameGraveyard.h:29

References AREA_FLAG_NEED_FLY, AreaTableEntry::flags, WorldObject::GetAreaId(), GetBattleground(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTeamId(), WorldObject::GetZoneId(), Unit::IsAlive(), Unit::isDead(), m_deathTimer, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GraveyardStruct::Map, PLAYER_FLAGS_IS_OUT_OF_BOUNDS, RemovePlayerFlag(), ResurrectPlayer(), sAreaTableStore, sBattlefieldMgr, SendDirectMessage(), sGraveyard, SMSG_DEATH_RELEASE_LOC, SpawnCorpseBones(), sScriptMgr, TeleportTo(), GraveyardStruct::x, GraveyardStruct::y, and GraveyardStruct::z.

Referenced by Spell::EffectStuck(), HandleDrowning(), WorldSession::HandleInstanceLockResponse(), WorldSession::HandleRepopRequestOpcode(), misc_commandscript::HandleUnstuckCommand(), WorldSession::LogoutPlayer(), RemovedInsignia(), TeleportTo(), Update(), and UpdateHomebindTime().

◆ ReportedAfkBy()

void Player::ReportedAfkBy ( Player reporter)

This player has been blamed to be inactive in a battleground.

11398{
11400 // Battleground also must be in progress!
11401 if (!bg || bg != reporter->GetBattleground() || GetTeamId() != reporter->GetTeamId() || bg->GetStatus() != STATUS_IN_PROGRESS)
11402 return;
11403
11404 // Xinef: 2 minutes startup + 2 minute of match
11406 return;
11407
11408 // check if player has 'Idle' or 'Inactive' debuff
11409 if (m_bgData.bgAfkReporter.find(reporter->GetGUID()) == m_bgData.bgAfkReporter.end() && !HasAura(43680) && !HasAura(43681) && reporter->CanReportAfkDueToLimit())
11410 {
11411 m_bgData.bgAfkReporter.insert(reporter->GetGUID());
11412 // by default 3 players have to complain to apply debuff
11413 if (m_bgData.bgAfkReporter.size() >= sWorld->getIntConfig(CONFIG_BATTLEGROUND_REPORT_AFK))
11414 {
11415 // cast 'Idle' spell
11416 CastSpell(this, 43680, true);
11417 m_bgData.bgAfkReporter.clear();
11418 }
11419 }
11420}
@ CONFIG_BATTLEGROUND_REPORT_AFK_TIMER
Definition WorldConfig.h:266
@ CONFIG_BATTLEGROUND_REPORT_AFK
Definition WorldConfig.h:267
uint32 GetStartTime() const
Definition Battleground.h:325
bool CanReportAfkDueToLimit()
Definition Player.cpp:11387

References BGData::bgAfkReporter, CanReportAfkDueToLimit(), Unit::CastSpell(), CONFIG_BATTLEGROUND_REPORT_AFK, CONFIG_BATTLEGROUND_REPORT_AFK_TIMER, GetBattleground(), Object::GetGUID(), Battleground::GetStartTime(), Battleground::GetStatus(), GetTeamId(), Unit::HasAura(), IN_MILLISECONDS, m_bgData, MINUTE, STATUS_IN_PROGRESS, and sWorld.

Referenced by WorldSession::HandleReportPvPAFK().

◆ ReputationChanged()

void Player::ReputationChanged ( FactionEntry const *  factionEntry)
2209{
2210 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2211 {
2212 if (uint32 questid = GetQuestSlotQuestId(i))
2213 {
2214 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2215 {
2216 if (qInfo->GetRepObjectiveFaction() == factionEntry->ID)
2217 {
2218 QuestStatusData& q_status = m_QuestStatus[questid];
2219 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2220 {
2221 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue())
2222 if (CanCompleteQuest(questid))
2223 CompleteQuest(questid);
2224 }
2225 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2226 {
2227 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue())
2228 IncompleteQuest(questid);
2229 }
2230 }
2231 }
2232 }
2233 }
2234}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

Referenced by ReputationMgr::SetOneFactionReputation().

◆ ReputationChanged2()

void Player::ReputationChanged2 ( FactionEntry const *  factionEntry)
2237{
2238 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2239 {
2240 if (uint32 questid = GetQuestSlotQuestId(i))
2241 {
2242 if (Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid))
2243 {
2244 if (qInfo->GetRepObjectiveFaction2() == factionEntry->ID)
2245 {
2246 QuestStatusData& q_status = m_QuestStatus[questid];
2247 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2248 {
2249 if (GetReputationMgr().GetReputation(factionEntry) >= qInfo->GetRepObjectiveValue2())
2250 if (CanCompleteQuest(questid))
2251 CompleteQuest(questid);
2252 }
2253 else if (q_status.Status == QUEST_STATUS_COMPLETE)
2254 {
2255 if (GetReputationMgr().GetReputation(factionEntry) < qInfo->GetRepObjectiveValue2())
2256 IncompleteQuest(questid);
2257 }
2258 }
2259 }
2260 }
2261 }
2262}

References CanCompleteQuest(), CompleteQuest(), GetQuestSlotQuestId(), GetReputation(), GetReputationMgr(), FactionEntry::ID, IncompleteQuest(), m_QuestStatus, MAX_QUEST_LOG_SIZE, QUEST_STATUS_COMPLETE, QUEST_STATUS_INCOMPLETE, sObjectMgr, and QuestStatusData::Status.

◆ ResetAchievementCriteria()

void Player::ResetAchievementCriteria ( AchievementCriteriaCondition  condition,
uint32  value,
bool  evenIfCriteriaComplete = false 
)
13984{
13985 m_achievementMgr->ResetAchievementCriteria(condition, value, evenIfCriteriaComplete);
13986}
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition AchievementMgr.cpp:516

References m_achievementMgr, and AchievementMgr::ResetAchievementCriteria().

Referenced by Battleground::AddPlayer(), spell_algalon_supermassive_fail::RecalculateDamage(), Battleground::RemovePlayerAtLeave(), and setDeathState().

◆ ResetAchievements()

void Player::ResetAchievements ( )
13959{
13961}
void Reset()
Definition AchievementMgr.cpp:492

References m_achievementMgr, and AchievementMgr::Reset().

Referenced by reset_commandscript::HandleResetAchievementsCommand().

◆ ResetAllPowers()

◆ ResetContestedPvP()

void Player::ResetContestedPvP ( )
inline
1866 {
1870 }
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:476
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
void ClearUnitState(uint32 f)
Definition Unit.h:722

References Unit::ClearUnitState(), m_contestedPvPTimer, PLAYER_FLAGS_CONTESTED_PVP, RemovePlayerFlag(), and UNIT_STATE_ATTACK_PLAYER.

Referenced by SetGameMaster(), SetIsSpectator(), and UpdateContestedPvP().

◆ ResetDailyQuestStatus()

void Player::ResetDailyQuestStatus ( )
12205{
12206 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12207 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, 0);
12208
12209 m_DFQuests.clear(); // Dungeon Finder Quests.
12210
12211 // DB data deleted in caller
12212 m_DailyQuestChanged = false;
12214}

References m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and Unit::SetUInt32Value().

◆ ResetFarSightDistance()

void Player::ResetFarSightDistance ( )
16291{
16292 _farSightDistance.reset();
16293}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ ResetInstances()

void Player::ResetInstances ( ObjectGuid  guid,
uint8  method,
bool  isRaid 
)
static

Reset all solo instances and optionally send a message on success for each.

196{
197 switch (method)
198 {
200 {
202 if (!p || p->GetDifficulty(false) != DUNGEON_DIFFICULTY_NORMAL)
203 break;
204 std::vector<InstanceSave*> toUnbind;
205 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(DUNGEON_DIFFICULTY_NORMAL));
206 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
207 {
208 InstanceSave* instanceSave = itr->second.save;
209 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
210 if (!entry || entry->IsRaid() || !instanceSave->CanReset())
211 {
212 continue;
213 }
214
215 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
216 if (!map || map->ToInstanceMap()->Reset(method))
217 {
218 p->SendResetInstanceSuccess(instanceSave->GetMapId());
219 toUnbind.push_back(instanceSave);
220 }
221 else
222 {
223 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
224 }
225
226 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
227 }
228 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
229 {
230 sInstanceSaveMgr->UnbindAllFor(*itr);
231 }
232 }
233 break;
235 {
237 if (!p)
238 break;
239 std::vector<InstanceSave*> toUnbind;
240 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), p->GetDifficulty(isRaid));
241 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
242 {
243 InstanceSave* instanceSave = itr->second.save;
244 MapEntry const* entry = sMapStore.LookupEntry(itr->first);
245 if (!entry || entry->IsRaid() != isRaid || !instanceSave->CanReset())
246 {
247 continue;
248 }
249
250 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
251 if (!map || map->ToInstanceMap()->Reset(method))
252 {
253 p->SendResetInstanceSuccess(instanceSave->GetMapId());
254 toUnbind.push_back(instanceSave);
255 }
256 else
257 {
258 p->SendResetInstanceFailed(0, instanceSave->GetMapId());
259 }
260
261 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
262 }
263 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
264 sInstanceSaveMgr->UnbindAllFor(*itr);
265 }
266 break;
268 {
270 if (!p)
271 break;
272 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
273 {
274 std::vector<InstanceSave*> toUnbind;
275 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(p->GetGUID(), Difficulty(d));
276 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
277 {
278 if (itr->second.perm)
279 continue;
280 InstanceSave* instanceSave = itr->second.save;
281 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
282 if (!map || p->FindMap() != map)
283 {
284 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
285 toUnbind.push_back(instanceSave);
286 }
287 //else
288 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
289
290 sInstanceSaveMgr->DeleteInstanceSavedData(instanceSave->GetInstanceId());
291 }
292 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
293 sInstanceSaveMgr->PlayerUnbindInstance(p->GetGUID(), (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
294 }
295 }
296 break;
298 {
300 for (uint8 d = 0; d < MAX_DIFFICULTY; ++d)
301 {
302 std::vector<InstanceSave*> toUnbind;
303 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(guid, Difficulty(d));
304 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
305 {
306 if (itr->second.perm)
307 continue;
308 InstanceSave* instanceSave = itr->second.save;
309 Map* map = sMapMgr->FindMap(instanceSave->GetMapId(), instanceSave->GetInstanceId());
310 if (!p || !map || p->FindMap() != map)
311 {
312 //p->SendResetInstanceSuccess(instanceSave->GetMapId());
313 toUnbind.push_back(instanceSave);
314 }
315 //else
316 // p->SendResetInstanceFailed(0, instanceSave->GetMapId());
317 }
318 for (std::vector<InstanceSave*>::const_iterator itr = toUnbind.begin(); itr != toUnbind.end(); ++itr)
319 sInstanceSaveMgr->PlayerUnbindInstance(guid, (*itr)->GetMapId(), (*itr)->GetDifficulty(), true, p);
320 }
321 }
322 break;
323 }
324}
#define MAX_DIFFICULTY
Definition DBCEnums.h:283
std::unordered_map< uint32, InstancePlayerBind > BoundInstancesMap
Definition InstanceSaveMgr.h:46
@ INSTANCE_RESET_GROUP_JOIN
Definition Map.h:641
@ INSTANCE_RESET_CHANGE_DIFFICULTY
Definition Map.h:639
@ INSTANCE_RESET_GROUP_LEAVE
Definition Map.h:642
@ INSTANCE_RESET_ALL
Definition Map.h:638
bool Reset(uint8 method, GuidList *globalSkipList=nullptr)
Definition Map.cpp:2148
uint32 GetMapId() const
Definition InstanceSaveMgr.h:62
bool CanReset() const
Definition InstanceSaveMgr.h:81
InstanceMap * ToInstanceMap()
Definition Map.h:377
void SendResetInstanceSuccess(uint32 MapId)
Definition PlayerMisc.cpp:326
void SendResetInstanceFailed(uint32 reason, uint32 MapId)
Definition PlayerMisc.cpp:333

References InstanceSave::CanReset(), DUNGEON_DIFFICULTY_NORMAL, ObjectAccessor::FindConnectedPlayer(), WorldObject::FindMap(), GetDifficulty(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), INSTANCE_RESET_ALL, INSTANCE_RESET_CHANGE_DIFFICULTY, INSTANCE_RESET_GROUP_JOIN, INSTANCE_RESET_GROUP_LEAVE, MapEntry::IsRaid(), MAX_DIFFICULTY, InstanceMap::Reset(), SendResetInstanceFailed(), SendResetInstanceSuccess(), sInstanceSaveMgr, sMapMgr, sMapStore, and Map::ToInstanceMap().

Referenced by Group::AddMember(), Group::Disband(), WorldSession::HandleResetInstancesOpcode(), WorldSession::HandleSetDungeonDifficultyOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), and Group::RemoveMember().

◆ ResetMap()

void Player::ResetMap ( )
overridevirtual

Reimplemented from WorldObject.

14782{
14783 // this may be called during Map::Update
14784 // after decrement+unlink, ++m_mapRefIter will continue correctly
14785 // when the first element of the list is being removed
14786 // nocheck_prev will return the padding element of the RefMgr
14787 // instead of nullptr in the case of prev
14788 GetMap()->UpdateIteratorBack(this);
14790 GetMapRef().unlink();
14791}
void UpdateIteratorBack(Player *player)
Definition Map.cpp:2386
MapReference & GetMapRef()
Definition Player.h:2495
virtual void ResetMap()
Definition Object.cpp:2138

References WorldObject::GetMap(), GetMapRef(), WorldObject::ResetMap(), Reference< TO, FROM >::unlink(), and Map::UpdateIteratorBack().

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandleSetRaidDifficultyOpcode().

◆ ResetMonthlyQuestStatus()

void Player::ResetMonthlyQuestStatus ( )
12237{
12238 if (m_monthlyquests.empty())
12239 return;
12240
12241 m_monthlyquests.clear();
12242 // DB data deleted in caller
12243 m_MonthlyQuestChanged = false;
12244}

References m_MonthlyQuestChanged, and m_monthlyquests.

◆ ResetPetTalents()

void Player::ResetPetTalents ( )
8959{
8960 // This needs another gossip option + NPC text as a confirmation.
8961 // The confirmation gossip listid has the text: "Yes, please do."
8962 Pet* pet = GetPet();
8963
8964 if (!pet || pet->getPetType() != HUNTER_PET || pet->m_usedTalentCount == 0)
8965 return;
8966
8967 CharmInfo* charmInfo = pet->GetCharmInfo();
8968 if (!charmInfo)
8969 {
8970 LOG_ERROR("entities.player", "Object ({}) is considered pet-like but doesn't have a charminfo!", pet->GetGUID().ToString());
8971 return;
8972 }
8973 pet->resetTalents();
8974 SendTalentsInfoData(true);
8975}
uint32 m_usedTalentCount
Definition Pet.h:134
bool resetTalents()
Definition Pet.cpp:2063

References Unit::GetCharmInfo(), Object::GetGUID(), GetPet(), Pet::getPetType(), HUNTER_PET, LOG_ERROR, Pet::m_usedTalentCount, Pet::resetTalents(), SendTalentsInfoData(), and ObjectGuid::ToString().

Referenced by OnGossipSelect(), and npc_pet_trainer::npc_pet_trainerAI::sGossipSelect().

◆ ResetSeasonalQuestStatus()

void Player::ResetSeasonalQuestStatus ( uint16  event_id)
12227{
12228 if (m_seasonalquests.empty() || m_seasonalquests[event_id].empty())
12229 return;
12230
12231 m_seasonalquests.erase(event_id);
12232 // DB data deleted in caller
12233 m_SeasonalQuestChanged = false;
12234}

References m_SeasonalQuestChanged, and m_seasonalquests.

◆ resetSpells()

void Player::resetSpells ( )
11870{
11871 // not need after this call
11874
11875 // make full copy of map (spells removed and marked as deleted at another spell remove
11876 // and we can't use original map for safe iterative with visit each spell at loop end
11877 PlayerSpellMap spellMap = GetSpellMap();
11878
11879 for (PlayerSpellMap::const_iterator iter = spellMap.begin(); iter != spellMap.end(); ++iter)
11880 removeSpell(iter->first, SPEC_MASK_ALL, false);
11881
11885}
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:195
@ AT_LOGIN_RESET_SPELLS
Definition Player.h:596
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1768

References AT_LOGIN_RESET_SPELLS, GetSpellMap(), HasAtLoginFlag(), LearnCustomSpells(), LearnDefaultSkills(), learnQuestRewardedSpells(), RemoveAtLoginFlag(), removeSpell(), and SPEC_MASK_ALL.

Referenced by WorldSession::HandlePlayerLoginFromDB(), and reset_commandscript::HandleResetSpellsCommand().

◆ resetTalents()

bool Player::resetTalents ( bool  noResetCost = false)
3717{
3718 sScriptMgr->OnPlayerTalentsReset(this, noResetCost);
3719
3720 // xinef: remove at login flag upon talents reset
3723
3724 // xinef: get max available talent points amount
3725 uint32 talentPointsForLevel = CalculateTalentsPoints();
3726
3727 // xinef: no talent points are used, return
3728 if (m_usedTalentCount == 0)
3729 return false;
3731
3732 // xinef: check if we have enough money
3733 uint32 resetCost = 0;
3734 if (!noResetCost && !sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST))
3735 {
3736 resetCost = resetTalentsCost();
3737 if (!HasEnoughMoney(resetCost))
3738 {
3740 return false;
3741 }
3742 }
3743
3744 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
3745
3746 // xinef: reset talents
3747 for (PlayerTalentMap::iterator iter = m_talents.begin(); iter != m_talents.end(); )
3748 {
3749 PlayerTalentMap::iterator itr = iter++;
3750
3751 if (itr->second->State == PLAYERSPELL_REMOVED)
3752 continue;
3753
3754 // xinef: talent not in current spec
3755 if (!(itr->second->specMask & GetActiveSpecMask()))
3756 continue;
3757
3758 // xinef: remove talent auras
3759 _removeTalentAurasAndSpells(itr->first);
3760
3761 // xinef: check if talent learns spell to spell book
3762 TalentEntry const* talentInfo = sTalentStore.LookupEntry(itr->second->talentID);
3763 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->first);
3764
3765 bool removed = false;
3766 if (talentInfo->addToSpellBook)
3767 if (!spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL))
3768 {
3769 removeSpell(itr->first, GetActiveSpecMask(), false);
3770 removed = true;
3771 }
3772
3773 // Xinef: send unlearn spell packet at talent remove
3774 if (!removed)
3775 SendLearnPacket(itr->first, false);
3776
3777 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3778 if (spellInfo->Effects[i].Effect == SPELL_EFFECT_LEARN_SPELL)
3779 if (sSpellMgr->IsAdditionalTalentSpell(spellInfo->Effects[i].TriggerSpell))
3780 removeSpell(spellInfo->Effects[i].TriggerSpell, GetActiveSpecMask(), false);
3781
3782 // xinef: remove talent modifies m_talents, move itr to map begin
3784 }
3785
3786 // xinef: remove titan grip if player had it set
3787 if (m_canTitanGrip)
3788 SetCanTitanGrip(false);
3789 // xinef: remove dual wield if player does not have dual wield spell (shamans)
3790 if (!HasSpell(674) && CanDualWield())
3791 SetCanDualWield(false);
3792
3794
3795 // pussywizard: removed saving to db, nothing important happens and saving only spells and talents may cause data integrity problems (eg. with skills saved to db)
3796 SetFreeTalentPoints(talentPointsForLevel);
3797
3798 if (!noResetCost)
3799 {
3800 ModifyMoney(-(int32)resetCost);
3803
3804 m_resetTalentsCost = resetCost;
3806 }
3807
3808 return true;
3809}
@ ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS
Definition DBCEnums.h:173
@ ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS
Definition DBCEnums.h:174
@ AT_LOGIN_RESET_TALENTS
Definition Player.h:597
@ CONFIG_NO_RESET_TALENT_COST
Definition WorldConfig.h:89
uint32 resetTalentsCost() const
Definition Player.cpp:3683

References _removeTalent(), _removeTalentAurasAndSpells(), ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, TalentEntry::addToSpellBook, AT_LOGIN_RESET_TALENTS, AutoUnequipOffhandIfNeed(), BUY_ERR_NOT_ENOUGHT_MONEY, CalculateTalentsPoints(), Unit::CanDualWield(), CONFIG_NO_RESET_TALENT_COST, SpellInfo::Effects, GetActiveSpecMask(), GameTime::GetGameTime(), HasAtLoginFlag(), SpellInfo::HasAttribute(), SpellInfo::HasEffect(), HasEnoughMoney(), HasSpell(), m_canTitanGrip, m_resetTalentsCost, m_resetTalentsTime, m_talents, m_usedTalentCount, MAX_SPELL_EFFECTS, ModifyMoney(), PET_SAVE_NOT_IN_SLOT, PLAYERSPELL_REMOVED, RemoveAtLoginFlag(), RemovePet(), removeSpell(), resetTalentsCost(), SendBuyError(), SendLearnPacket(), Unit::SetCanDualWield(), SetCanTitanGrip(), SetFreeTalentPoints(), SPELL_ATTR0_PASSIVE, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, sTalentStore, sWorld, and UpdateAchievementCriteria().

Referenced by WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetTalentsCommand(), WorldSession::HandleTalentWipeConfirmOpcode(), and InitTalentForLevel().

◆ resetTalentsCost()

uint32 Player::resetTalentsCost ( ) const
3684{
3685 // The first time reset costs 1 gold
3686 if (m_resetTalentsCost < 1 * GOLD)
3687 return 1 * GOLD;
3688 // then 5 gold
3689 else if (m_resetTalentsCost < 5 * GOLD)
3690 return 5 * GOLD;
3691 // After that it increases in increments of 5 gold
3692 else if (m_resetTalentsCost < 10 * GOLD)
3693 return 10 * GOLD;
3694 else
3695 {
3696 uint64 months = (GameTime::GetGameTime().count() - m_resetTalentsTime) / MONTH;
3697 if (months > 0)
3698 {
3699 // This cost will be reduced by a rate of 5 gold per month
3700 int32 new_cost = int32(m_resetTalentsCost - 5 * GOLD * months);
3701 // to a minimum of 10 gold.
3702 return (new_cost < 10 * GOLD ? 10 * GOLD : new_cost);
3703 }
3704 else
3705 {
3706 // After that it increases in increments of 5 gold
3707 int32 new_cost = m_resetTalentsCost + 5 * GOLD;
3708 // until it hits a cap of 50 gold.
3709 if (new_cost > 50 * GOLD)
3710 new_cost = 50 * GOLD;
3711 return new_cost;
3712 }
3713 }
3714}
constexpr auto MONTH
Definition Common.h:51
@ GOLD
Definition SharedDefines.h:264

References GameTime::GetGameTime(), GOLD, m_resetTalentsCost, m_resetTalentsTime, and MONTH.

Referenced by resetTalents(), and SendTalentWipeConfirm().

◆ ResetWeeklyQuestStatus()

void Player::ResetWeeklyQuestStatus ( )
12217{
12218 if (m_weeklyquests.empty())
12219 return;
12220
12221 m_weeklyquests.clear();
12222 // DB data deleted in caller
12223 m_WeeklyQuestChanged = false;
12224}

References m_WeeklyQuestChanged, and m_weeklyquests.

◆ RestoreAllSpellMods()

void Player::RestoreAllSpellMods ( uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
10023{
10024 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
10025 if (m_currentSpells[i])
10026 RestoreSpellMods(m_currentSpells[i], ownerAuraId, aura);
10027}
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9955
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2121

References CURRENT_MAX_SPELL, Unit::m_currentSpells, and RestoreSpellMods().

◆ RestoreBaseRune()

void Player::RestoreBaseRune ( uint8  index)
13446{
13447 AuraEffect const* aura = m_runes->runes[index].ConvertAura;
13448 // If rune was converted by a non-pasive aura that still active we should keep it converted
13449 if (aura && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR0_PASSIVE))
13450 return;
13451 ConvertRune(index, GetBaseRune(index));
13452 SetRuneConvertAura(index, nullptr);
13453 // Don't drop passive talents providing rune convertion
13454 if (!aura || aura->GetAuraType() != SPELL_AURA_CONVERT_RUNE)
13455 return;
13456 for (uint8 i = 0; i < MAX_RUNES; ++i)
13457 {
13458 if (aura == m_runes->runes[i].ConvertAura)
13459 return;
13460 }
13461 aura->GetBase()->Remove();
13462}
@ SPELL_AURA_CONVERT_RUNE
Definition SpellAuraDefines.h:312
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:448
Aura * GetBase() const
Definition SpellAuraEffects.h:49

References RuneInfo::ConvertAura, ConvertRune(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), GetBaseRune(), AuraEffect::GetSpellInfo(), SpellInfo::HasAttribute(), m_runes, MAX_RUNES, Aura::Remove(), Runes::runes, SetRuneConvertAura(), SPELL_ATTR0_PASSIVE, and SPELL_AURA_CONVERT_RUNE.

Referenced by Spell::TakeRunePower().

◆ RestoreHealthAfterDuel()

void Player::RestoreHealthAfterDuel ( )
inline
uint32 healthBeforeDuel
Definition Player.h:3009

References healthBeforeDuel, and Unit::SetHealth().

◆ RestoreManaAfterDuel()

void Player::RestoreManaAfterDuel ( )
inline
uint32 manaBeforeDuel
Definition Player.h:3010

References manaBeforeDuel, POWER_MANA, and Unit::SetPower().

◆ RestoreSpellMods()

void Player::RestoreSpellMods ( Spell spell,
uint32  ownerAuraId = 0,
Aura aura = nullptr 
)
Todo:
track these changes correctly
9956{
9957 if (!spell || spell->m_appliedMods.empty())
9958 return;
9959
9960 std::list<Aura*> aurasQueue;
9961
9962 for (uint8 i = 0; i < MAX_SPELLMOD; ++i)
9963 {
9964 for (SpellModList::iterator itr = m_spellMods[i].begin(); itr != m_spellMods[i].end(); ++itr)
9965 {
9966 SpellModifier* mod = *itr;
9967
9968 // Spellmods without aura set cannot be charged
9969 if (!mod->ownerAura || !mod->ownerAura->IsUsingCharges())
9970 continue;
9971
9972 // Restore only specific owner aura mods
9973 if (ownerAuraId && (ownerAuraId != mod->ownerAura->GetSpellInfo()->Id))
9974 continue;
9975
9976 if (aura && mod->ownerAura != aura)
9977 continue;
9978
9979 // Check if mod affected this spell
9980 // First, check if the mod aura applied at least one spellmod to this spell
9981 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(mod->ownerAura);
9982 if (iterMod == spell->m_appliedMods.end())
9983 continue;
9984 // Second, check if the current mod is one of those applied by the mod aura
9985 if (!(mod->mask & spell->m_spellInfo->SpellFamilyFlags))
9986 continue;
9987
9988 // remove from list - This will be done after all mods have been gone through
9989 // to ensure we iterate over all mods of an aura before removing said aura
9990 // from applied mods (Else, an aura with two mods on the current spell would
9991 // only see the first of its modifier restored)
9992 aurasQueue.push_back(mod->ownerAura);
9993
9994 // add mod charges back to mod
9995 if (mod->charges == -1)
9996 mod->charges = 1;
9997 else
9998 mod->charges++;
9999
10000 // Do not set more spellmods than available
10001 if (mod->ownerAura->GetCharges() < mod->charges)
10002 mod->charges = mod->ownerAura->GetCharges();
10003
10004 // Skip this check for now - aura charges may change due to various reason
10006 //ASSERT (mod->ownerAura->GetCharges() <= mod->charges);
10007 }
10008 }
10009
10010 for (std::list<Aura*>::iterator itr = aurasQueue.begin(); itr != aurasQueue.end(); ++itr)
10011 {
10012 Spell::UsedSpellMods::iterator iterMod = spell->m_appliedMods.find(*itr);
10013 if (iterMod != spell->m_appliedMods.end())
10014 spell->m_appliedMods.erase(iterMod);
10015 }
10016
10017 // Xinef: clear the list just do be sure
10018 if (!ownerAuraId && !aura)
10019 spell->m_appliedMods.clear();
10020}
uint8 GetCharges() const
Definition SpellAuras.h:141
flag96 SpellFamilyFlags
Definition SpellInfo.h:388

References SpellModifier::charges, Aura::GetCharges(), Aura::GetSpellInfo(), SpellInfo::Id, Aura::IsUsingCharges(), Spell::m_appliedMods, Spell::m_spellInfo, m_spellMods, SpellModifier::mask, MAX_SPELLMOD, SpellModifier::ownerAura, and SpellInfo::SpellFamilyFlags.

Referenced by Spell::DoAllEffectOnTarget(), Spell::finish(), Unit::HandleDummyAuraProc(), and RestoreAllSpellMods().

◆ ResummonPetTemporaryUnSummonedIfAny()

void Player::ResummonPetTemporaryUnSummonedIfAny ( )
14283{
14285 return;
14286
14287 // not resummon in not appropriate state
14289 return;
14290
14291 if (GetPetGUID())
14292 return;
14293
14295 return;
14296
14297 Pet* newPet = new Pet(this);
14298 if (!newPet->LoadPetFromDB(this, 0, m_temporaryUnsummonedPetNumber, true))
14299 delete newPet;
14300
14302}
bool IsPetNeedBeTemporaryUnsummoned() const
Definition Player.h:2421
uint32 GetLastPetSpell() const
Definition Player.h:2463
bool CanResummonPet(uint32 spellid)
Definition Player.cpp:14304

References CanResummonPet(), GetLastPetSpell(), Unit::GetPetGUID(), IsPetNeedBeTemporaryUnsummoned(), IsSpectator(), Pet::LoadPetFromDB(), and m_temporaryUnsummonedPetNumber.

Referenced by Unit::_ExitVehicle(), WorldSession::HandleMoveTeleportAck(), and WorldSession::HandleMoveWorldportAck().

◆ ResurectUsingRequestData()

void Player::ResurectUsingRequestData ( )

Teleport before resurrecting by player, otherwise the player might get attacked from creatures near his corpse

12873{
12876
12877 if (IsBeingTeleported())
12878 {
12880 return;
12881 }
12882
12883 ResurrectPlayer(0.0f, false);
12884
12887 else
12888 SetFullHealth();
12889
12892 else
12894
12895 SetPower(POWER_RAGE, 0);
12896
12898
12900}
void ScheduleDelayedOperation(uint32 operation)
Definition Player.h:2099
float m_resurrectZ
Definition Player.h:2855
uint32 m_resurrectMap
Definition Player.h:2854
float m_resurrectX
Definition Player.h:2855
float m_resurrectY
Definition Player.h:2855

References DELAYED_RESURRECT_PLAYER, Unit::GetMaxHealth(), Unit::GetMaxPower(), Position::GetOrientation(), IsBeingTeleported(), m_resurrectHealth, m_resurrectMana, m_resurrectMap, m_resurrectX, m_resurrectY, m_resurrectZ, POWER_ENERGY, POWER_MANA, POWER_RAGE, ResurrectPlayer(), ScheduleDelayedOperation(), Unit::SetFullHealth(), Unit::SetHealth(), Unit::SetPower(), SpawnCorpseBones(), and TeleportTo().

Referenced by WorldSession::HandleResurrectResponseOpcode().

◆ ResurrectPlayer()

void Player::ResurrectPlayer ( float  restore_percent,
bool  applySickness = false 
)
4488{
4489 if (!sScriptMgr->OnPlayerCanResurrect(this))
4490 return;
4491
4492 WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4 * 4); // remove spirit healer position
4493 data << uint32(-1);
4494 data << float(0);
4495 data << float(0);
4496 data << float(0);
4497 SendDirectMessage(&data);
4498
4499 // speed change, land walk
4500
4501 // remove death flag + set aura
4503 RemoveAurasDueToSpell(20584); // speed bonuses
4504 RemoveAurasDueToSpell(8326); // SPELL_AURA_GHOST
4505
4506 if (GetSession()->IsARecruiter() || (GetSession()->GetRecruiterId() != 0))
4508
4511 SendMoveRoot(false);
4512 SetWaterWalking(false);
4513 m_deathTimer = 0;
4514
4515 // set health/powers (0- will be set in caller)
4516 if (restore_percent > 0.0f)
4517 {
4518 SetHealth(uint32(GetMaxHealth()*restore_percent));
4519 SetPower(POWER_MANA, uint32(GetMaxPower(POWER_MANA)*restore_percent));
4520 SetPower(POWER_RAGE, 0);
4522 }
4523
4524 // trigger update zone for alive state zone updates
4525 uint32 newzone, newarea;
4526 GetZoneAndAreaId(newzone, newarea);
4527 UpdateZone(newzone, newarea, true);
4528 sOutdoorPvPMgr->HandlePlayerResurrects(this, newzone);
4529
4530 if (Battleground* bg = GetBattleground())
4531 bg->HandlePlayerResurrect(this);
4532
4533 // update visibility
4535
4536 // recast lost by death auras of any items held in the inventory
4538
4539 sScriptMgr->OnPlayerResurrect(this, restore_percent, applySickness);
4540
4541 if (!applySickness)
4542 {
4543 return;
4544 }
4545
4546 //Characters from level 1-10 are not affected by resurrection sickness.
4547 //Characters from level 11-19 will suffer from one minute of sickness
4548 //for each level they are above 10.
4549 //Characters level 20 and up suffer from ten minutes of sickness.
4550 int32 startLevel = sWorld->getIntConfig(CONFIG_DEATH_SICKNESS_LEVEL);
4551
4552 if (int32(GetLevel()) >= startLevel)
4553 {
4554 // set resurrection sickness
4555 CastSpell(this, 15007, true);
4556
4557 // not full duration
4558 if (int32(GetLevel()) < startLevel + 9)
4559 {
4560 int32 delta = (int32(GetLevel()) - startLevel + 1) * MINUTE;
4561
4562 if (Aura* aur = GetAura(15007, GetGUID()))
4563 {
4564 aur->SetDuration(delta * IN_MILLISECONDS);
4565 }
4566 }
4567 }
4568}
@ MOVE_LAND_WALK
Definition Player.h:453
@ UNIT_BYTE1_FLAG_GROUND
Definition UnitDefines.h:58
@ CONFIG_DEATH_SICKNESS_LEVEL
Definition WorldConfig.h:257
void UpdateZone(uint32 newZone, uint32 newArea, bool force=false)
Definition PlayerUpdates.cpp:1252
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition PlayerUpdates.cpp:1604
void CastAllObtainSpells()
Definition Player.cpp:7013
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition Object.cpp:3079

References Alive, CastAllObtainSpells(), Unit::CastSpell(), CONFIG_DEATH_SICKNESS_LEVEL, Unit::GetAura(), GetBattleground(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxHealth(), Unit::GetMaxPower(), GetSession(), WorldObject::GetZoneAndAreaId(), IN_MILLISECONDS, m_deathTimer, MINUTE, MOVE_LAND_WALK, POWER_ENERGY, POWER_MANA, POWER_RAGE, Unit::RemoveAurasDueToSpell(), SendDirectMessage(), Unit::SendMoveRoot(), Object::SetByteValue(), setDeathState(), Object::SetDynamicFlag(), Unit::SetHealth(), SetMovement(), Unit::SetPower(), Unit::SetWaterWalking(), SMSG_DEATH_RELEASE_LOC, sOutdoorPvPMgr, sScriptMgr, sWorld, UNIT_BYTE1_FLAG_GROUND, UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_DYNFLAG_REFER_A_FRIEND, UNIT_FIELD_BYTES_1, UpdateObjectVisibility(), and UpdateZone().

Referenced by Battleground::_ProcessResurrect(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), group_commandscript::HandleGroupReviveCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), LoadFromDB(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ ResyncRunes()

void Player::ResyncRunes ( uint8  count)
13475{
13476 WorldPacket data(SMSG_RESYNC_RUNES, 4 + count * 2);
13477 data << uint32(count);
13478 for (uint32 i = 0; i < count; ++i)
13479 {
13480 data << uint8(GetCurrentRune(i)); // rune type
13481 data << uint8(255 - (GetRuneCooldown(i) * 51)); // passed cooldown time (0-255)
13482 }
13483 SendDirectMessage(&data);
13484}
RuneType GetCurrentRune(uint8 index) const
Definition Player.h:2511
@ SMSG_RESYNC_RUNES
Definition Opcodes.h:1189

References GetCurrentRune(), GetRuneCooldown(), SendDirectMessage(), and SMSG_RESYNC_RUNES.

◆ RewardExtraBonusTalentPoints()

void Player::RewardExtraBonusTalentPoints ( uint32  bonusTalentPoints)

A talent point boost. Usage: 1). Hot update situation (occurred when character is online, like PlayerScript:OnAchiComplete): Right after calling this function, character can reward talent points by calling function player->InitTalentForLevel().

2). Data initing situation (like PlayerScript:OnLoadFromDB)

6080{
6081 if (bonusTalentPoints)
6082 {
6083 m_extraBonusTalentCount += bonusTalentPoints;
6084 }
6085}

References m_extraBonusTalentCount.

◆ RewardHonor()

bool Player::RewardHonor ( Unit uVictim,
uint32  groupsize,
int32  honor = -1,
bool  awardXP = true 
)

Calculate the amount of honor gained based on the victim and the size of the group for which the honor is divided An exact honor value can also be given (overriding the calcs)

6091{
6092 // do not reward honor in arenas, but enable onkill spellproc
6093 if (InArena())
6094 {
6095 if (!uVictim || uVictim == this || !uVictim->IsPlayer())
6096 return false;
6097
6098 if (GetBgTeamId() == uVictim->ToPlayer()->GetBgTeamId())
6099 return false;
6100
6101 return true;
6102 }
6103
6104 // 'Inactive' this aura prevents the player from gaining honor points and battleground tokens
6106 return false;
6107
6108 /* check if player has same IP
6109 if (uVictim && uVictim->IsPlayer())
6110 {
6111 if (GetSession()->GetRemoteAddress() == uVictim->ToPlayer()->GetSession()->GetRemoteAddress())
6112 return false;
6113 }
6114 */
6115
6116 ObjectGuid victim_guid;
6117 uint32 victim_rank = 0;
6118
6119 // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
6121
6122 // do not reward honor in arenas, but return true to enable onkill spellproc
6123 if (InArena())
6124 return true;
6125
6126 // Promote to float for calculations
6127 float honor_f = (float)honor;
6128
6129 if (honor_f <= 0)
6130 {
6131 if (!uVictim || uVictim == this || uVictim->HasNoPVPCreditAura())
6132 return false;
6133
6134 victim_guid = uVictim->GetGUID();
6135
6136 if (uVictim->IsPlayer())
6137 {
6138 Player* victim = uVictim->ToPlayer();
6139
6140 if (GetTeamId() == victim->GetTeamId() && !sWorld->IsFFAPvPRealm())
6141 return false;
6142
6143 uint8 k_level = GetLevel();
6144 uint8 k_grey = Acore::XP::GetGrayLevel(k_level);
6145 uint8 v_level = victim->GetLevel();
6146
6147 if (v_level <= k_grey)
6148 return false;
6149
6150 // PLAYER_CHOSEN_TITLE VALUES DESCRIPTION
6151 // [0] Just name
6152 // [1..14] Alliance honor titles and player name
6153 // [15..28] Horde honor titles and player name
6154 // [29..38] Other title and player name
6155 // [39+] Nothing
6156 uint32 victim_title = victim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
6157 uint32 killer_title = 0;
6158 sScriptMgr->OnPlayerVictimRewardBefore(this, victim, killer_title, victim_title);
6159 // Get Killer titles, CharTitlesEntry::bit_index
6160 // Ranks:
6161 // title[1..14] -> rank[5..18]
6162 // title[15..28] -> rank[5..18]
6163 // title[other] -> 0
6164 if (victim_title == 0)
6165 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6166 else if (victim_title < 15)
6167 victim_rank = victim_title + 4;
6168 else if (victim_title < 29)
6169 victim_rank = victim_title - 14 + 4;
6170 else
6171 victim_guid.Clear(); // Don't show HK: <rank> message, only log.
6172
6173 honor_f = std::ceil(Acore::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
6174
6175 // count the number of playerkills in one day
6177 // and those in a lifetime
6185 sScriptMgr->OnPlayerVictimRewardAfter(this, victim, killer_title, victim_rank, honor_f);
6186 }
6187 else
6188 {
6189 if (!uVictim->ToCreature()->IsRacialLeader())
6190 return false;
6191
6192 honor_f = 100.0f; // ??? need more info
6193 victim_rank = 19; // HK: Leader
6194 }
6195 }
6196
6197 if (uVictim)
6198 {
6199 if (groupsize > 1)
6200 honor_f /= groupsize;
6201
6202 // apply honor multiplier from aura (not stacking-get highest)
6204 }
6205
6206 honor_f *= sWorld->getRate(RATE_HONOR);
6207 // Back to int now
6208 honor = int32(honor_f);
6209 // honor - for show honor points in log
6210 // victim_guid - for show victim name in log
6211 // victim_rank [1..4] HK: <dishonored rank>
6212 // victim_rank [5..19] HK: <alliance\horde rank>
6213 // victim_rank [0, 20+] HK: <>
6214 WorldPacket data(SMSG_PVP_CREDIT, 4 + 8 + 4);
6215 data << honor;
6216 data << victim_guid;
6217 data << victim_rank;
6218
6219 // Xinef: non quest case, quest honor obtain is send in quest reward packet
6220 if (uVictim || groupsize > 0)
6221 SendDirectMessage(&data);
6222
6223 // add honor points
6224 ModifyHonorPoints(honor);
6225
6227
6228 // Xinef: Battleground experience
6229 if (awardXP)
6230 if (Battleground* bg = GetBattleground())
6231 {
6232 bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping
6233 // Xinef: Only for BG activities
6234 if (!uVictim)
6235 {
6236 uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f));
6237 sScriptMgr->OnPlayerGiveXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND);
6238 GiveXP(xp, nullptr);
6239 }
6240 }
6241
6242 if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE))
6243 {
6244 if (!uVictim || uVictim == this || uVictim->HasNoPVPCreditAura())
6245 return true;
6246
6247 if (uVictim->IsPlayer())
6248 {
6249 // Check if allowed to receive it in current map
6251 if ((MapType == 1 && !InBattleground() && !IsFFAPvP())
6252 || (MapType == 2 && !IsFFAPvP())
6253 || (MapType == 3 && !InBattleground()))
6254 return true;
6255
6256 uint32 itemID = sWorld->getIntConfig(CONFIG_PVP_TOKEN_ID);
6257 int32 count = sWorld->getIntConfig(CONFIG_PVP_TOKEN_COUNT);
6258
6259 if (AddItem(itemID, count))
6260 ChatHandler(GetSession()).PSendSysMessage("You have been awarded a token for slaying another player.");
6261 }
6262 }
6263
6264 return true;
6265}
@ SCORE_BONUS_HONOR
Definition BattlegroundScore.h:31
@ SPELL_AURA_PLAYER_INACTIVE
Definition Battleground.h:136
@ ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL
Definition DBCEnums.h:219
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL
Definition DBCEnums.h:149
@ ACHIEVEMENT_CRITERIA_TYPE_HK_RACE
Definition DBCEnums.h:167
@ ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA
Definition DBCEnums.h:145
@ ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL
Definition DBCEnums.h:182
@ ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS
Definition DBCEnums.h:166
@ XPSOURCE_BATTLEGROUND
Definition Player.h:1008
@ SPELL_AURA_MOD_HONOR_GAIN_PCT
Definition SpellAuraDefines.h:344
@ CONFIG_PVP_TOKEN_MAP_TYPE
Definition WorldConfig.h:294
@ CONFIG_PVP_TOKEN_ENABLE
Definition WorldConfig.h:88
@ CONFIG_PVP_TOKEN_ID
Definition WorldConfig.h:295
@ CONFIG_PVP_TOKEN_COUNT
Definition WorldConfig.h:296
@ RATE_HONOR
Definition WorldConfig.h:470
bool IsRacialLeader() const
Definition Creature.h:78
void Clear()
Definition ObjectGuid.h:138
bool AddItem(uint32 itemId, uint32 count)
Definition Player.cpp:15677
bool IsFFAPvP()
Definition Player.cpp:16235
TeamId GetBgTeamId() const
Definition Player.h:2282
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition Unit.cpp:6034
bool HasNoPVPCreditAura() const
Definition Unit.h:1765
@ SMSG_PVP_CREDIT
Definition Opcodes.h:682
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition Formulas.h:31
std::unordered_map< std::string, Player * > MapType
Definition ObjectAccessor.cpp:85

References ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, AddItem(), AddPct(), Object::ApplyModUInt32Value(), ObjectGuid::Clear(), CONFIG_PVP_TOKEN_COUNT, CONFIG_PVP_TOKEN_ENABLE, CONFIG_PVP_TOKEN_ID, CONFIG_PVP_TOKEN_MAP_TYPE, WorldObject::GetAreaId(), GetBattleground(), GetBgTeamId(), Unit::getClass(), Acore::XP::GetGrayLevel(), Object::GetGUID(), Unit::GetLevel(), Unit::GetMaxPositiveAuraModifier(), Unit::getRace(), GetSession(), GetTeamId(), Object::GetUInt32Value(), GiveXP(), Unit::HasAura(), Unit::HasNoPVPCreditAura(), Acore::Honor::hk_honor_at_level_f(), InArena(), InBattleground(), IsFFAPvP(), Object::IsPlayer(), Creature::IsRacialLeader(), ModifyHonorPoints(), PLAYER_CHOSEN_TITLE, PLAYER_FIELD_KILLS, PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, ChatHandler::PSendSysMessage(), RATE_HONOR, SCORE_BONUS_HONOR, SendDirectMessage(), SMSG_PVP_CREDIT, SPELL_AURA_MOD_HONOR_GAIN_PCT, SPELL_AURA_PLAYER_INACTIVE, sScriptMgr, sWorld, Object::ToCreature(), Object::ToPlayer(), UpdateAchievementCriteria(), UpdateHonorFields(), and XPSOURCE_BATTLEGROUND.

Referenced by KillRewarder::_RewardHonor(), DuelComplete(), Spell::EffectAddHonor(), OutdoorPvPSI::HandleAreaTrigger(), honor_commandscript::HandleHonorAddCommand(), honor_commandscript::HandleHonorAddKillCommand(), RewardQuest(), and Battleground::UpdatePlayerScore().

◆ RewardPlayerAndGroupAtEvent()

void Player::RewardPlayerAndGroupAtEvent ( uint32  creature_id,
WorldObject pRewardSource 
)
12782{
12783 if (!pRewardSource)
12784 return;
12785
12786 ObjectGuid creature_guid = (pRewardSource->IsCreature()) ? pRewardSource->GetGUID() : ObjectGuid::Empty;
12787
12788 // prepare data for near group iteration
12789 if (Group* group = GetGroup())
12790 {
12791 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
12792 {
12793 Player* player = itr->GetSource();
12794 if (!player)
12795 continue;
12796
12797 if (!player->IsAtGroupRewardDistance(pRewardSource))
12798 continue; // member (alive or dead) or his corpse at req. distance
12799
12800 // quest objectives updated only for alive group member or dead but with not released body
12801 if (player->IsAlive() || !player->GetCorpse())
12802 player->KilledMonsterCredit(creature_id, creature_guid);
12803 }
12804 }
12805 else // if (!group)
12806 KilledMonsterCredit(creature_id, creature_guid);
12807}
GroupReference * next()
Definition GroupReference.h:36

References ObjectGuid::Empty, GetCorpse(), GetGroup(), Object::GetGUID(), Unit::IsAlive(), IsAtGroupRewardDistance(), Object::IsCreature(), KilledMonsterCredit(), and GroupReference::next().

Referenced by Spell::EffectKillCredit(), spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), SmartScript::ProcessAction(), and SmartAI::StopFollow().

◆ RewardPlayerAndGroupAtKill()

void Player::RewardPlayerAndGroupAtKill ( Unit victim,
bool  isBattleGround 
)
12777{
12778 KillRewarder(this, victim, isBattleGround).Reward();
12779}
Definition KillRewarder.h:28
void Reward()
Definition KillRewarder.cpp:268

References KillRewarder::Reward().

Referenced by Unit::Kill(), and Battleground::RewardXPAtKill().

◆ RewardQuest()

void Player::RewardQuest ( Quest const *  quest,
uint32  reward,
Object questGiver,
bool  announce = true,
bool  isLFGReward = false 
)
660{
661 //this THING should be here to protect code from quest, which cast on player far teleport as a reward
662 //should work fine, cause far teleport will be executed in Player::Update()
664
665 uint32 quest_id = quest->GetQuestId();
666
667 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
668 {
669 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->RequiredItemId[i]))
670 {
671 if (quest->RequiredItemCount[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->RequiredItemId[i], quest_id, true))
672 DestroyItemCount(quest->RequiredItemId[i], 9999, true);
673 else
674 DestroyItemCount(quest->RequiredItemId[i], quest->RequiredItemCount[i], true);
675 }
676 }
677 for (uint8 i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
678 {
679 if (ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(quest->ItemDrop[i]))
680 {
681 if (quest->ItemDropQuantity[i] > 0 && itemTemplate->Bonding == BIND_QUEST_ITEM && !quest->IsRepeatable() && !HasQuestForItem(quest->ItemDrop[i], quest_id))
682 DestroyItemCount(quest->ItemDrop[i], 9999, true);
683 else
684 DestroyItemCount(quest->ItemDrop[i], quest->ItemDropQuantity[i], true);
685 }
686 }
687
688 RemoveTimedQuest(quest_id);
689
690 std::vector<std::pair<uint32, uint32>> problematicItems;
691
692 if (quest->GetRewChoiceItemsCount())
693 {
694 if (uint32 itemId = quest->RewardChoiceItemId[reward])
695 {
696 ItemPosCountVec dest;
697 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardChoiceItemCount[reward]) == EQUIP_ERR_OK)
698 {
699 Item* item = StoreNewItem(dest, itemId, true);
700 SendNewItem(item, quest->RewardChoiceItemCount[reward], true, false, false, false);
701
702 sScriptMgr->OnPlayerQuestRewardItem(this, item, quest->RewardChoiceItemCount[reward]);
703 }
704 else
705 {
706 problematicItems.emplace_back(itemId, quest->RewardChoiceItemCount[reward]);
707 }
708 }
709 }
710
711 if (quest->GetRewItemsCount())
712 {
713 for (uint32 i = 0; i < quest->GetRewItemsCount(); ++i)
714 {
715 if (uint32 itemId = quest->RewardItemId[i])
716 {
717 ItemPosCountVec dest;
718 if (CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, itemId, quest->RewardItemIdCount[i]) == EQUIP_ERR_OK)
719 {
720 Item* item = StoreNewItem(dest, itemId, true);
721 SendNewItem(item, quest->RewardItemIdCount[i], true, false, false, false);
722
723 sScriptMgr->OnPlayerQuestRewardItem(this, item, quest->RewardItemIdCount[i]);
724 }
725 else
726 problematicItems.emplace_back(itemId, quest->RewardItemIdCount[i]);
727 }
728 }
729 }
730
731 // Xinef: send items that couldn't be added properly by mail
732 if (!problematicItems.empty())
733 {
734 SendItemRetrievalMail(problematicItems);
735 }
736
737 RewardReputation(quest);
738
739 uint16 log_slot = FindQuestSlot(quest_id);
740 if (log_slot < MAX_QUEST_LOG_SIZE)
741 SetQuestSlot(log_slot, 0);
742
743 bool const rewarded = IsQuestRewarded(quest_id) && !quest->IsDFQuest() && !(quest->IsDaily() || quest->IsWeekly() || quest->IsMonthly());
744
745 // Repeatable quests (not time-based reset ones) should not give XP on subsequent completions
746 uint32 XP = rewarded ? 0 : CalculateQuestRewardXP(quest);
747
748 sScriptMgr->OnPlayerQuestComputeXP(this, quest, XP);
749 int32 moneyRew = 0;
750 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) || sScriptMgr->OnPlayerShouldBeRewardedWithMoneyInsteadOfExp(this))
751 {
752 moneyRew = quest->GetRewMoneyMaxLevel();
753 }
754 else
755 {
756 sScriptMgr->OnPlayerGiveXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST);
757 GiveXP(XP, nullptr, 1.0f, isLFGReward);
758 }
759
760 // Give player extra money if GetRewOrReqMoney > 0 and get ReqMoney if negative
761 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(GetLevel()))
762 {
763 moneyRew += rewOrReqMoney;
764 }
765
766 if (moneyRew)
767 {
768 ModifyMoney(moneyRew);
769
770 if (moneyRew > 0)
772 }
773
774 // honor reward
775 if (uint32 honor = quest->CalculateHonorGain(GetLevel()))
776 RewardHonor(nullptr, 0, honor);
777
778 // title reward
779 if (quest->GetCharTitleId())
780 {
781 if (CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(quest->GetCharTitleId()))
782 SetTitle(titleEntry);
783 }
784
785 if (quest->GetBonusTalents())
786 {
787 m_questRewardTalentCount += quest->GetBonusTalents();
789 }
790
791 if (quest->GetRewArenaPoints())
792 ModifyArenaPoints(quest->GetRewArenaPoints());
793
794 // Send reward mail
795 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
796 {
797 //- TODO: Poor design of mail system
798 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
799 if (quest->GetRewMailSenderEntry() != 0)
800 MailDraft(mail_template_id).SendMailTo(trans, this, quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
801 else
802 MailDraft(mail_template_id).SendMailTo(trans, this, questGiver, MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
803 CharacterDatabase.CommitTransaction(trans);
804 }
805
806 if (quest->IsDaily() || quest->IsDFQuest())
807 {
808 SetDailyQuestStatus(quest_id);
809 if (quest->IsDaily())
810 {
813 }
814 }
815 else if (quest->IsWeekly())
816 SetWeeklyQuestStatus(quest_id);
817 else if (quest->IsMonthly())
818 SetMonthlyQuestStatus(quest_id);
819 else if (quest->IsSeasonal())
820 SetSeasonalQuestStatus(quest_id);
821
822 RemoveActiveQuest(quest_id, false);
823 SetRewardedQuest(quest_id);
824
825 if (announce)
826 SendQuestReward(quest, XP);
827
828 // cast spells after mark quest complete (some spells have quest completed state requirements in spell_area data)
829 if (quest->GetRewSpellCast() > 0)
830 {
831 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpellCast());
832 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
833 {
834 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
835 creature->CastSpell(this, quest->GetRewSpellCast(), true);
836 }
837 else
838 CastSpell(this, quest->GetRewSpellCast(), true);
839 }
840 else if (quest->GetRewSpell() > 0)
841 {
842 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
843 if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
844 {
845 if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
846 creature->CastSpell(this, quest->GetRewSpell(), true);
847 }
848 else
849 CastSpell(this, quest->GetRewSpell(), true);
850 }
851
852 if (quest->GetZoneOrSort() > 0)
856
857 // pussywizard: replaced partial save with full save
858 SaveToDB(false, false);
859
860 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
861 {
864 }
865
866 SendQuestUpdate(quest_id);
867
869
870 //lets remove flag for delayed teleports
872
873 // Xinef: area auras may change on quest completion!
876
877 sScriptMgr->OnPlayerCompleteQuest(this, quest);
878}
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE
Definition DBCEnums.h:129
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY
Definition DBCEnums.h:128
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT
Definition DBCEnums.h:127
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST
Definition DBCEnums.h:131
@ ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD
Definition DBCEnums.h:175
@ ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST
Definition DBCEnums.h:141
@ MAIL_CHECK_MASK_HAS_BODY
Definition Mail.h:51
PlayerXPSource
Definition Player.h:1003
@ XPSOURCE_QUEST
Definition Player.h:1005
@ XPSOURCE_QUEST_DF
Definition Player.h:1006
@ SPELL_EFFECT_CREATE_ITEM
Definition SharedDefines.h:813
bool IsUnit() const
Definition Object.h:209
bool HasPvPForcingQuest() const
Definition PlayerQuest.cpp:2495
bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId=0, bool turnIn=false, bool *showInLoot=nullptr) const
Definition PlayerQuest.cpp:2264
uint32 CalculateQuestRewardXP(Quest const *quest)
Definition PlayerQuest.cpp:1402
void SetMonthlyQuestStatus(uint32 quest_id)
Definition Player.cpp:12198
void SetSeasonalQuestStatus(uint32 quest_id)
Definition Player.cpp:12188
void SendItemRetrievalMail(uint32 itemEntry, uint32 count)
Definition PlayerMisc.cpp:439
void SendQuestReward(Quest const *quest, uint32 XP)
Definition PlayerQuest.cpp:2357
void SetDailyQuestStatus(uint32 quest_id)
Definition Player.cpp:12140
void RewardReputation(Unit *victim)
Definition Player.cpp:5968
void SetRewardedQuest(uint32 quest_id)
Definition PlayerQuest.cpp:880
void SetWeeklyQuestStatus(uint32 quest_id)
Definition Player.cpp:12182
void RemoveActiveQuest(uint32 questId, bool update=true)
Definition PlayerQuest.cpp:1495
void SetMustDelayTeleport(bool setting)
Definition Player.h:2961
bool IsSelfCast() const
Definition SpellInfo.cpp:1090
bool IsInHostileArea
Definition Player.h:357

References ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT, ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, BIND_QUEST_ITEM, Quest::CalculateHonorGain(), CalculateQuestRewardXP(), CanStoreNewItem(), Unit::CastSpell(), CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, DestroyItemCount(), EQUIP_ERR_OK, FindQuestSlot(), WorldObject::GetAreaId(), Quest::GetBonusTalents(), Quest::GetCharTitleId(), Object::GetGUID(), Unit::GetLevel(), WorldObject::GetMap(), Quest::GetQuestId(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMailDelaySecs(), Quest::GetRewMailSenderEntry(), Quest::GetRewMailTemplateId(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetRewSpell(), Quest::GetRewSpellCast(), WorldObject::GetZoneId(), Quest::GetZoneOrSort(), GiveXP(), SpellInfo::HasEffect(), Quest::HasFlag(), HasPvPForcingQuest(), HasQuestForItem(), InitTalentForLevel(), Quest::IsDaily(), Quest::IsDFQuest(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, Quest::IsMonthly(), IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), SpellInfo::IsSelfCast(), Object::IsUnit(), Quest::IsWeekly(), Quest::ItemDrop, Quest::ItemDropQuantity, m_questRewardTalentCount, MAIL_CHECK_MASK_HAS_BODY, MAX_QUEST_LOG_SIZE, ModifyArenaPoints(), ModifyMoney(), NULL_BAG, NULL_SLOT, pvpInfo, QUEST_FLAGS_FLAGS_PVP, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_SOURCE_ITEM_IDS_COUNT, RemoveActiveQuest(), RemoveTimedQuest(), Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, RewardHonor(), Quest::RewardItemId, Quest::RewardItemIdCount, RewardReputation(), SaveToDB(), sCharTitlesStore, SendItemRetrievalMail(), MailDraft::SendMailTo(), SendNewItem(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestUpdate(), SetDailyQuestStatus(), SetMonthlyQuestStatus(), SetMustDelayTeleport(), SetQuestSlot(), SetRewardedQuest(), SetSeasonalQuestStatus(), SetTitle(), SetWeeklyQuestStatus(), sObjectMgr, SPELL_EFFECT_CREATE_ITEM, SPELL_EFFECT_LEARN_SPELL, sScriptMgr, sSpellMgr, StoreNewItem(), sWorld, UpdateAchievementCriteria(), UpdateAreaDependentAuras(), UpdatePvPState(), UpdateZoneDependentAuras(), XPSOURCE_QUEST, and XPSOURCE_QUEST_DF.

Referenced by CompleteQuest(), lfg::LFGMgr::FinishDungeon(), and WorldSession::HandleQuestgiverChooseRewardOpcode().

◆ RewardReputation() [1/2]

void Player::RewardReputation ( Quest const *  quest)
6021{
6022 for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
6023 {
6024 if (!quest->RewardFactionId[i])
6025 continue;
6026
6027 float rep = 0.f;
6028
6029 if (quest->RewardFactionValueIdOverride[i])
6030 {
6031 rep = quest->RewardFactionValueIdOverride[i] / 100.f;
6032 }
6033 else
6034 {
6035 uint32 row = ((quest->RewardFactionValueId[i] < 0) ? 1 : 0) + 1;
6036 if (QuestFactionRewEntry const* questFactionRewEntry = sQuestFactionRewardStore.LookupEntry(row))
6037 {
6038 uint32 field = std::abs(quest->RewardFactionValueId[i]);
6039 rep = static_cast<float>(questFactionRewEntry->QuestRewFactionValue[field]);
6040 }
6041 }
6042
6043 if (rep == 0.f)
6044 continue;
6045
6046 if (quest->IsDaily())
6047 {
6048 rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6049 sScriptMgr->OnPlayerGiveReputation(this, quest->RewardFactionId[i], rep, REPUTATION_SOURCE_DAILY_QUEST);
6050 }
6051 else if (quest->IsWeekly())
6052 {
6053 rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6054 sScriptMgr->OnPlayerGiveReputation(this, quest->RewardFactionId[i], rep, REPUTATION_SOURCE_WEEKLY_QUEST);
6055 }
6056 else if (quest->IsMonthly())
6057 {
6058 rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6059 sScriptMgr->OnPlayerGiveReputation(this, quest->RewardFactionId[i], rep, REPUTATION_SOURCE_MONTHLY_QUEST);
6060 }
6061 else if (quest->IsRepeatable())
6062 {
6063 rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6064 sScriptMgr->OnPlayerGiveReputation(this, quest->RewardFactionId[i], rep, REPUTATION_SOURCE_REPEATABLE_QUEST);
6065 }
6066 else
6067 {
6068 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false);
6069 sScriptMgr->OnPlayerGiveReputation(this, quest->RewardFactionId[i], rep, REPUTATION_SOURCE_QUEST);
6070 }
6071
6072 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i]))
6073 {
6074 GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER));
6075 }
6076 }
6077}
DBCStorage< QuestFactionRewEntry > sQuestFactionRewardStore(QuestFactionRewardfmt)
#define QUEST_REPUTATIONS_COUNT
Definition QuestDef.h:41
@ QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER
Definition QuestDef.h:166
float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus=false)
Definition Player.cpp:5888
bool ModifyReputation(FactionEntry const *factionEntry, float standing, bool noSpillOver=false, Optional< ReputationRank > repMaxCap={})
Definition ReputationMgr.h:117
Definition DBCStructure.h:1459

References CalculateReputationGain(), GetQuestLevel(), GetReputationMgr(), Quest::HasSpecialFlag(), Quest::IsDaily(), Quest::IsMonthly(), Quest::IsRepeatable(), Quest::IsWeekly(), ReputationMgr::ModifyReputation(), QUEST_REPUTATIONS_COUNT, QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER, REPUTATION_SOURCE_DAILY_QUEST, REPUTATION_SOURCE_MONTHLY_QUEST, REPUTATION_SOURCE_QUEST, REPUTATION_SOURCE_REPEATABLE_QUEST, REPUTATION_SOURCE_WEEKLY_QUEST, Quest::RewardFactionId, Quest::RewardFactionValueId, Quest::RewardFactionValueIdOverride, sFactionStore, sQuestFactionRewardStore, and sScriptMgr.

◆ RewardReputation() [2/2]

void Player::RewardReputation ( Unit victim)
5969{
5970 if (!victim || victim->IsPlayer())
5971 return;
5972
5973 if (victim->ToCreature()->IsReputationRewardDisabled())
5974 return;
5975
5976 ReputationOnKillEntry const* Rep = sObjectMgr->GetReputationOnKilEntry(victim->ToCreature()->GetCreatureTemplate()->Entry);
5977 if (!Rep)
5978 return;
5979
5980 uint32 ChampioningFaction = 0;
5981
5983 {
5984 // support for: Championing - http://www.wowwiki.com/Championing
5985 Map const* map = GetMap();
5986 if (map->IsNonRaidDungeon())
5987 if (LFGDungeonEntry const* dungeon = GetLFGDungeon(map->GetId(), map->GetDifficulty()))
5988 if (dungeon->TargetLevel == 80)
5989 ChampioningFaction = GetChampioningFaction();
5990 }
5991
5992 TeamId teamId = GetTeamId(true); // Always check player original reputation when rewarding
5993
5994 if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE))
5995 {
5996 float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
5997 sScriptMgr->OnPlayerGiveReputation(this, Rep->RepFaction1, donerep1, REPUTATION_SOURCE_KILL);
5998
5999 FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1);
6000 if (factionEntry1)
6001 {
6002 GetReputationMgr().ModifyReputation(factionEntry1, donerep1, false, static_cast<ReputationRank>(Rep->ReputationMaxCap1));
6003 }
6004 }
6005
6006 if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE))
6007 {
6008 float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast<float>(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
6009 sScriptMgr->OnPlayerGiveReputation(this, Rep->RepFaction2, donerep2, REPUTATION_SOURCE_KILL);
6010
6011 FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2);
6012 if (factionEntry2)
6013 {
6014 GetReputationMgr().ModifyReputation(factionEntry2, donerep2, false, static_cast<ReputationRank>(Rep->ReputationMaxCap2));
6015 }
6016 }
6017}
LFGDungeonEntry const * GetLFGDungeon(uint32 mapId, Difficulty difficulty)
Returns LFGDungeonEntry for a specific map and difficulty. Will return first found entry if multiple ...
Definition DBCStores.cpp:852
TeamId
Definition SharedDefines.h:770
bool IsReputationRewardDisabled() const
Definition Creature.h:363
bool IsNonRaidDungeon() const
Definition Map.h:296
uint32 GetChampioningFaction() const
Definition Player.h:2556
uint32 Entry
Definition CreatureData.h:187
Definition DBCStructure.h:1246
Definition ObjectMgr.h:568
uint32 ReputationMaxCap1
Definition ObjectMgr.h:571
float RepValue1
Definition ObjectMgr.h:572
uint32 RepFaction1
Definition ObjectMgr.h:569
uint32 RepFaction2
Definition ObjectMgr.h:570
bool TeamDependent
Definition ObjectMgr.h:577
float RepValue2
Definition ObjectMgr.h:574
uint32 ReputationMaxCap2
Definition ObjectMgr.h:573

References CalculateReputationGain(), CreatureTemplate::Entry, GetChampioningFaction(), Creature::GetCreatureTemplate(), Map::GetDifficulty(), Map::GetId(), Unit::GetLevel(), GetLFGDungeon(), WorldObject::GetMap(), GetReputationMgr(), GetTeamId(), Map::IsNonRaidDungeon(), Object::IsPlayer(), Creature::IsReputationRewardDisabled(), ReputationMgr::ModifyReputation(), ReputationOnKillEntry::RepFaction1, ReputationOnKillEntry::RepFaction2, REPUTATION_SOURCE_KILL, ReputationOnKillEntry::ReputationMaxCap1, ReputationOnKillEntry::ReputationMaxCap2, ReputationOnKillEntry::RepValue1, ReputationOnKillEntry::RepValue2, sFactionStore, sObjectMgr, sScriptMgr, TEAM_ALLIANCE, TEAM_HORDE, ReputationOnKillEntry::TeamDependent, and Object::ToCreature().

Referenced by KillRewarder::_RewardReputation(), and RewardQuest().

◆ Satisfy()

bool Player::Satisfy ( DungeonProgressionRequirements const *  ar,
uint32  target_map,
bool  report = false 
)
6720{
6721 if (!IsGameMaster() && ar)
6722 {
6723 uint8 LevelMin = 0;
6724 uint8 LevelMax = 0;
6725
6726 MapEntry const* mapEntry = sMapStore.LookupEntry(target_map);
6727 if (!mapEntry)
6728 return false;
6729
6730 if (!sWorld->getBoolConfig(CONFIG_INSTANCE_IGNORE_LEVEL))
6731 {
6732 if (ar->levelMin && GetLevel() < ar->levelMin)
6733 LevelMin = ar->levelMin;
6734 if (ar->levelMax && GetLevel() > ar->levelMax)
6735 LevelMax = ar->levelMax;
6736 }
6737
6738 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, target_map, this))
6739 {
6741 return false;
6742 }
6743
6744 Player* partyLeader = this;
6745 std::string leaderName = m_session->GetAcoreString(LANG_YOU);
6746 {
6747 ObjectGuid leaderGuid = GetGroup() ? GetGroup()->GetLeaderGUID() : GetGUID();
6748 Player* tempLeader = HashMapHolder<Player>::Find(leaderGuid);
6749 if (leaderGuid != GetGUID())
6750 {
6751 if (tempLeader != nullptr)
6752 {
6753 partyLeader = tempLeader;
6754 }
6755 leaderName = GetGroup()->GetLeaderName();
6756 }
6757 }
6758
6759 //Check all items
6760 std::vector<const ProgressionRequirement*> missingPlayerItems;
6761 std::vector<const ProgressionRequirement*> missingLeaderItems;
6762 for (const ProgressionRequirement* itemRequirement : ar->items)
6763 {
6764 Player* checkPlayer = this;
6765 std::vector<const ProgressionRequirement*>* missingItems = &missingPlayerItems;
6766 if (itemRequirement->checkLeaderOnly)
6767 {
6768 checkPlayer = partyLeader;
6769 missingItems = &missingLeaderItems;
6770 }
6771
6772 if (itemRequirement->faction == TEAM_NEUTRAL || itemRequirement->faction == checkPlayer->GetTeamId(true))
6773 {
6774 if (!checkPlayer->HasItemCount(itemRequirement->id, 1))
6775 {
6776 missingItems->push_back(itemRequirement);
6777 }
6778 }
6779 }
6780
6781 //Check all achievements
6782 std::vector<const ProgressionRequirement*> missingPlayerAchievements;
6783 std::vector<const ProgressionRequirement*> missingLeaderAchievements;
6784 for (const ProgressionRequirement* achievementRequirement : ar->achievements)
6785 {
6786 Player* checkPlayer = this;
6787 std::vector<const ProgressionRequirement*>* missingAchievements = &missingPlayerAchievements;
6788 if (achievementRequirement->checkLeaderOnly)
6789 {
6790 checkPlayer = partyLeader;
6791 missingAchievements = &missingLeaderAchievements;
6792 }
6793
6794 if (achievementRequirement->faction == TEAM_NEUTRAL || achievementRequirement->faction == GetTeamId(true))
6795 {
6796 if (!checkPlayer || !checkPlayer->HasAchieved(achievementRequirement->id))
6797 {
6798 missingAchievements->push_back(achievementRequirement);
6799 }
6800 }
6801 }
6802
6803 //Check all quests
6804 std::vector<const ProgressionRequirement*> missingPlayerQuests;
6805 std::vector<const ProgressionRequirement*> missingLeaderQuests;
6806 for (const ProgressionRequirement* questRequirement : ar->quests)
6807 {
6808 Player* checkPlayer = this;
6809 std::vector<const ProgressionRequirement*>* missingQuests = &missingPlayerQuests;
6810 if (questRequirement->checkLeaderOnly)
6811 {
6812 checkPlayer = partyLeader;
6813 missingQuests = &missingLeaderQuests;
6814 }
6815
6816 if (questRequirement->faction == TEAM_NEUTRAL || questRequirement->faction == checkPlayer->GetTeamId(true))
6817 {
6818 if (!checkPlayer->GetQuestRewardStatus(questRequirement->id))
6819 {
6820 missingQuests->push_back(questRequirement);
6821 }
6822 }
6823 }
6824
6825 //Check if avg ILVL requirement is allowed
6826 bool ilvlRequirementNotMet = false;
6828 {
6829 const int32 currentIlvl = (int32)GetAverageItemLevelForDF();
6830 if (ar->reqItemLevel > currentIlvl)
6831 {
6832 ilvlRequirementNotMet = true;
6833 }
6834 }
6835
6836 Difficulty target_difficulty = GetDifficulty(mapEntry->IsRaid());
6837 MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
6838 if (LevelMin || LevelMax || ilvlRequirementNotMet
6839 || missingPlayerItems.size() || missingPlayerQuests.size() || missingPlayerAchievements.size()
6840 || missingLeaderItems.size() || missingLeaderQuests.size() || missingLeaderAchievements.size())
6841 {
6842 if (!sScriptMgr->OnPlayerNotAvoidSatisfy(this, ar, target_map, report))
6843 return true;
6844
6845 if (report)
6846 {
6847 uint8 requirementPrintMode = sWorld->getIntConfig(CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE);
6848
6849 if (requirementPrintMode == 0)
6850 {
6851 //Just print out the requirements are not met
6853 }
6854 else if (requirementPrintMode == 1)
6855 {
6856 //Blizzlike method of printing out the requirements
6857 if (missingPlayerQuests.size() && !missingPlayerQuests[0]->note.empty())
6858 {
6859 ChatHandler(GetSession()).PSendSysMessage("{}", missingPlayerQuests[0]->note);
6860 }
6861 else if (missingLeaderQuests.size() && !missingLeaderQuests[0]->note.empty())
6862 {
6863 ChatHandler(GetSession()).PSendSysMessage("{}", missingLeaderQuests[0]->note);
6864 }
6865 else if (mapDiff->hasErrorMessage)
6866 {
6867 // if (missingAchievement) covered by this case
6868 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6869 }
6870 else if (missingPlayerItems.size())
6871 {
6873 std::string name = sObjectMgr->GetItemTemplate(missingPlayerItems[0]->id)->Name1;
6874 if (ItemLocale const* il = sObjectMgr->GetItemLocale(missingPlayerItems[0]->id))
6875 {
6876 ObjectMgr::GetLocaleString(il->Name, loc_idx, name);
6877 }
6879 }
6880 else if (LevelMin)
6881 {
6883 }
6884 else if (ilvlRequirementNotMet)
6885 {
6887 }
6888 }
6889 else
6890 {
6891 bool errorAlreadyPrinted = false;
6892 //Pretty way of printing out requirements
6893 if (missingPlayerQuests.size())
6894 {
6896 PrettyPrintRequirementsQuestList(missingPlayerQuests);
6897 errorAlreadyPrinted = true;
6898 }
6899 if (missingLeaderQuests.size())
6900 {
6902 PrettyPrintRequirementsQuestList(missingLeaderQuests);
6903 errorAlreadyPrinted = true;
6904 }
6905
6906 if (missingPlayerAchievements.size())
6907 {
6909 PrettyPrintRequirementsAchievementsList(missingPlayerAchievements);
6910 errorAlreadyPrinted = true;
6911 }
6912 if (missingLeaderAchievements.size())
6913 {
6915 PrettyPrintRequirementsAchievementsList(missingLeaderAchievements);
6916 errorAlreadyPrinted = true;
6917 }
6918
6919 if (missingPlayerItems.size())
6920 {
6922 PrettyPrintRequirementsItemsList(missingPlayerItems);
6923 errorAlreadyPrinted = true;
6924 }
6925
6926 if (missingLeaderItems.size())
6927 {
6929 PrettyPrintRequirementsItemsList(missingLeaderItems);
6930 errorAlreadyPrinted = true;
6931 }
6932
6933 if (ilvlRequirementNotMet)
6934 {
6936 }
6937
6938 if (LevelMin)
6939 {
6941 }
6942 else if (LevelMax)
6943 {
6945 }
6946 else if (mapDiff->hasErrorMessage && !errorAlreadyPrinted)
6947 {
6948 SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
6949 }
6950 }
6951
6952 //Print the extra string
6954 if (optionalStringID > 0)
6955 {
6956 ChatHandler(GetSession()).SendSysMessage(optionalStringID);
6957 }
6958 }
6959 return false;
6960 }
6961 }
6962 return true;
6963}
MapDifficulty const * GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
Definition DBCStores.cpp:767
@ DISABLE_TYPE_MAP
Definition DisableMgr.h:30
@ LANG_INSTANCE_CLOSED
Definition Language.h:1063
@ LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS
Definition Language.h:857
@ LANG_YOU
Definition Language.h:76
@ LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET
Definition Language.h:853
@ LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS
Definition Language.h:850
@ LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS
Definition Language.h:848
@ LANG_ACCESS_REQUIREMENT_NOT_MET
Definition Language.h:852
@ LANG_LEVEL_MINREQUIRED_AND_ITEM
Definition Language.h:82
@ LANG_ACCESS_REQUIREMENT_MAX_LEVEL
Definition Language.h:854
@ LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS
Definition Language.h:849
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS
Definition Language.h:855
@ LANG_LEVEL_MINREQUIRED
Definition Language.h:81
@ LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS
Definition Language.h:856
@ TRANSFER_ABORT_DIFFICULTY
Definition Player.h:785
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID
Definition WorldConfig.h:360
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE
Definition WorldConfig.h:359
@ CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL
Definition WorldConfig.h:123
@ CONFIG_INSTANCE_IGNORE_LEVEL
Definition WorldConfig.h:43
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:160
const char * GetLeaderName() const
Definition Group.cpp:2321
ObjectGuid GetLeaderGUID() const
Definition Group.cpp:2306
float GetAverageItemLevelForDF()
Definition Player.cpp:15861
void PrettyPrintRequirementsQuestList(const std::vector< const ProgressionRequirement * > &missingQuests) const
Definition PlayerStorage.cpp:6611
void PrettyPrintRequirementsItemsList(const std::vector< const ProgressionRequirement * > &missingItems) const
Definition PlayerStorage.cpp:6681
void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg=0)
Definition Player.cpp:11767
void PrettyPrintRequirementsAchievementsList(const std::vector< const ProgressionRequirement * > &missingAchievements) const
Definition PlayerStorage.cpp:6648
void SendAreaTriggerMessage(std::string_view str)
Definition WorldSession.cpp:232
Definition DBCStructure.h:2223
bool hasErrorMessage
Definition DBCStructure.h:2229

References DungeonProgressionRequirements::achievements, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_OPTIONAL_STRING_ID, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PORTAL_CHECK_ILVL, CONFIG_DUNGEON_ACCESS_REQUIREMENTS_PRINT_MODE, CONFIG_INSTANCE_IGNORE_LEVEL, DISABLE_TYPE_MAP, HashMapHolder< T >::Find(), WorldSession::GetAcoreString(), GetAverageItemLevelForDF(), GetDifficulty(), GetDownscaledMapDifficultyData(), GetGroup(), Object::GetGUID(), Group::GetLeaderGUID(), Group::GetLeaderName(), Unit::GetLevel(), ObjectMgr::GetLocaleString(), GetQuestRewardStatus(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), GetTeamId(), HasAchieved(), MapDifficulty::hasErrorMessage, HasItemCount(), IsGameMaster(), MapEntry::IsRaid(), DungeonProgressionRequirements::items, LANG_ACCESS_REQUIREMENT_AVERAGE_ILVL_NOT_MET, LANG_ACCESS_REQUIREMENT_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_ACHIEVEMENTS, LANG_ACCESS_REQUIREMENT_LEADER_COMPLETE_QUESTS, LANG_ACCESS_REQUIREMENT_LEADER_OBTAIN_ITEMS, LANG_ACCESS_REQUIREMENT_MAX_LEVEL, LANG_ACCESS_REQUIREMENT_NOT_MET, LANG_ACCESS_REQUIREMENT_OBTAIN_ITEMS, LANG_INSTANCE_CLOSED, LANG_LEVEL_MINREQUIRED, LANG_LEVEL_MINREQUIRED_AND_ITEM, LANG_YOU, DungeonProgressionRequirements::levelMax, DungeonProgressionRequirements::levelMin, m_session, PrettyPrintRequirementsAchievementsList(), PrettyPrintRequirementsItemsList(), PrettyPrintRequirementsQuestList(), ChatHandler::PSendSysMessage(), DungeonProgressionRequirements::quests, DungeonProgressionRequirements::reqItemLevel, sDisableMgr, WorldSession::SendAreaTriggerMessage(), ChatHandler::SendSysMessage(), SendTransferAborted(), sMapStore, sObjectMgr, sScriptMgr, sWorld, TEAM_NEUTRAL, and TRANSFER_ABORT_DIFFICULTY.

Referenced by Spell::CheckCast(), WorldSession::HandleSetRaidDifficultyOpcode(), and MapMgr::PlayerCannotEnter().

◆ SatisfyQuestClass()

bool Player::SatisfyQuestClass ( Quest const *  qInfo,
bool  msg 
) const
1086{
1087 uint32 reqClass = qInfo->GetRequiredClasses();
1088
1089 if (reqClass == 0)
1090 return true;
1091
1092 if ((reqClass & getClassMask()) == 0)
1093 {
1094 if (msg)
1096
1097 return false;
1098 }
1099
1100 return true;
1101}
@ INVALIDREASON_DONT_HAVE_REQ
Definition QuestDef.h:48
void SendCanTakeQuestResponse(uint32 msg) const
Definition PlayerQuest.cpp:2405

References Unit::getClassMask(), Quest::GetRequiredClasses(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestConditions()

bool Player::SatisfyQuestConditions ( Quest const *  qInfo,
bool  msg 
)
1160{
1161 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, qInfo->GetQuestId());
1162 if (!sConditionMgr->IsObjectMeetToConditions(this, conditions))
1163 {
1164 if (msg)
1166 LOG_DEBUG("condition", "Player::SatisfyQuestConditions: conditions not met for quest {}", qInfo->GetQuestId());
1167 return false;
1168 }
1169 return true;
1170}

References CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, Quest::GetQuestId(), INVALIDREASON_DONT_HAVE_REQ, LOG_DEBUG, sConditionMgr, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestDay()

bool Player::SatisfyQuestDay ( Quest const *  qInfo,
bool  msg 
) const
1269{
1270 if (!qInfo->IsDaily() && !qInfo->IsDFQuest())
1271 return true;
1272
1273 if (qInfo->IsDFQuest())
1274 {
1275 if (m_DFQuests.find(qInfo->GetQuestId()) != m_DFQuests.end())
1276 return false;
1277
1278 return true;
1279 }
1280
1281 bool have_slot = false;
1282 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
1283 {
1284 uint32 id = GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx);
1285 if (qInfo->GetQuestId() == id)
1286 return false;
1287
1288 if (!id)
1289 have_slot = true;
1290 }
1291
1292 if (!have_slot)
1293 {
1294 if (msg)
1296 return false;
1297 }
1298
1299 return true;
1300}
@ INVALIDREASON_DAILY_QUESTS_REMAINING
Definition QuestDef.h:58

References Quest::GetQuestId(), Object::GetUInt32Value(), INVALIDREASON_DAILY_QUESTS_REMAINING, Quest::IsDaily(), Quest::IsDFQuest(), m_DFQuests, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, and SendCanTakeQuestResponse().

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SatisfyQuestExclusiveGroup()

bool Player::SatisfyQuestExclusiveGroup ( Quest const *  qInfo,
bool  msg 
) const
1184{
1185 // non positive exclusive group, if > 0 then can be start if any other quest in exclusive group already started/completed
1186 if (qInfo->GetExclusiveGroup() <= 0)
1187 return true;
1188
1189 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qInfo->GetExclusiveGroup()));
1190
1191 for (; range.first != range.second; ++range.first)
1192 {
1193 uint32 exclude_Id = range.first->second;
1194
1195 // skip checked quest id, only state of other quests in group is interesting
1196 if (exclude_Id == qInfo->GetQuestId())
1197 continue;
1198
1199 // not allow have daily quest if daily quest from exclusive group already recently completed
1200 Quest const* Nquest = sObjectMgr->GetQuestTemplate(exclude_Id);
1201 if (!SatisfyQuestDay(Nquest, false) || !SatisfyQuestWeek(Nquest, false) || !SatisfyQuestSeasonal(Nquest, false))
1202 {
1203 if (msg)
1205
1206 return false;
1207 }
1208
1209 // alternative quest already started or completed - but don't check rewarded states if both are repeatable
1210 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE || (!(qInfo->IsRepeatable() && Nquest->IsRepeatable()) && !Nquest->IsSeasonal() && IsQuestRewarded(exclude_Id))) // pussywizard: added !Nquest->IsSeasonal() because seasonal quests are considered rewarded only if finished this year, this is checked above in SatisfyQuestSeasonal
1211 {
1212 if (msg)
1214 return false;
1215 }
1216 }
1217 return true;
1218}
std::pair< ExclusiveQuestGroups::const_iterator, ExclusiveQuestGroups::const_iterator > ExclusiveQuestGroupsBounds
Definition ObjectMgr.h:1144

References Quest::GetExclusiveGroup(), Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsRepeatable(), Quest::IsSeasonal(), QUEST_STATUS_NONE, SatisfyQuestDay(), SatisfyQuestSeasonal(), SatisfyQuestWeek(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestLevel()

bool Player::SatisfyQuestLevel ( Quest const *  qInfo,
bool  msg 
) const
968{
969 if (GetLevel() < qInfo->GetMinLevel())
970 {
971 if (msg)
973 return false;
974 }
975 else if (qInfo->GetMaxLevel() > 0 && GetLevel() > qInfo->GetMaxLevel())
976 {
977 if (msg)
978 SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
979 return false;
980 }
981 return true;
982}
@ INVALIDREASON_QUEST_FAILED_LOW_LEVEL
Definition QuestDef.h:49

References Unit::GetLevel(), Quest::GetMaxLevel(), Quest::GetMinLevel(), INVALIDREASON_DONT_HAVE_REQ, INVALIDREASON_QUEST_FAILED_LOW_LEVEL, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), npc_wg_quest_giver::GetDialogStatus(), and GetQuestDialogStatus().

◆ SatisfyQuestLog()

bool Player::SatisfyQuestLog ( bool  msg)
985{
986 // exist free slot
988 return true;
989
990 if (msg)
991 {
993 SendDirectMessage(&data);
994 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
995 }
996 return false;
997}
@ SMSG_QUESTLOG_FULL
Definition Opcodes.h:435

References FindQuestSlot(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, SendDirectMessage(), and SMSG_QUESTLOG_FULL.

Referenced by CanAddQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestMonth()

bool Player::SatisfyQuestMonth ( Quest const *  qInfo,
bool  msg 
) const
1327{
1328 if (!qInfo->IsMonthly() || m_monthlyquests.empty())
1329 return true;
1330
1331 // if not found in cooldown list
1332 return m_monthlyquests.find(qInfo->GetQuestId()) == m_monthlyquests.end();
1333}

References Quest::GetQuestId(), Quest::IsMonthly(), and m_monthlyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestNextChain()

bool Player::SatisfyQuestNextChain ( Quest const *  qInfo,
bool  msg 
) const
1221{
1222 uint32 nextQuest = qInfo->GetNextQuestInChain();
1223 if (!nextQuest)
1224 return true;
1225
1226 // next quest in chain already started or completed
1227 if (GetQuestStatus(nextQuest) != QUEST_STATUS_NONE) // GetQuestStatus returns QUEST_STATUS_COMPLETED for rewarded quests
1228 {
1229 if (msg)
1231 return false;
1232 }
1233
1234 // check for all quests further up the chain
1235 // only necessary if there are quest chains with more than one quest that can be skipped
1236 //return SatisfyQuestNextChain(qInfo->GetNextQuestInChain(), msg);
1237 return true;
1238}

References Quest::GetNextQuestInChain(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPrevChain()

bool Player::SatisfyQuestPrevChain ( Quest const *  qInfo,
bool  msg 
) const
1241{
1242 // No previous quest in chain
1243 if (qInfo->prevChainQuests.empty())
1244 return true;
1245
1246 for (Quest::PrevChainQuests::const_iterator iter = qInfo->prevChainQuests.begin(); iter != qInfo->prevChainQuests.end(); ++iter)
1247 {
1248 QuestStatusMap::const_iterator itr = m_QuestStatus.find(*iter);
1249
1250 // If any of the previous quests in chain active, return false
1251 if (itr != m_QuestStatus.end() && itr->second.Status != QUEST_STATUS_NONE)
1252 {
1253 if (msg)
1255 return false;
1256 }
1257
1258 // check for all quests further down the chain
1259 // only necessary if there are quest chains with more than one quest that can be skipped
1260 //if (!SatisfyQuestPrevChain(prevId, msg))
1261 // return false;
1262 }
1263
1264 // No previous quest in chain active
1265 return true;
1266}

References INVALIDREASON_DONT_HAVE_REQ, m_QuestStatus, Quest::prevChainQuests, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestPreviousQuest()

bool Player::SatisfyQuestPreviousQuest ( Quest const *  qInfo,
bool  msg 
) const
1000{
1001 // No previous quest (might be first quest in a series)
1002 if (qInfo->prevQuests.empty())
1003 return true;
1004
1005 for (Quest::PrevQuests::const_iterator iter = qInfo->prevQuests.begin(); iter != qInfo->prevQuests.end(); ++iter)
1006 {
1007 uint32 prevId = std::abs(*iter);
1008
1009 Quest const* qPrevInfo = sObjectMgr->GetQuestTemplate(prevId);
1010
1011 if (qPrevInfo)
1012 {
1013 // If any of the positive previous quests completed, return true
1014 if (*iter > 0 && IsQuestRewarded(prevId) && (!qPrevInfo->IsSeasonal() || !SatisfyQuestSeasonal(qPrevInfo, false)))
1015 {
1016 // skip one-from-all exclusive group
1017 if (qPrevInfo->GetExclusiveGroup() >= 0)
1018 return true;
1019
1020 // each-from-all exclusive group (< 0)
1021 // can be start if only all quests in prev quest exclusive group completed and rewarded
1022 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1023
1024 for (; range.first != range.second; ++range.first)
1025 {
1026 uint32 exclude_Id = range.first->second;
1027
1028 // skip checked quest id, only state of other quests in group is interesting
1029 if (exclude_Id == prevId)
1030 continue;
1031
1032 // alternative quest from group also must be completed and rewarded(reported)
1033
1034 Quest const* qExcludeInfo = sObjectMgr->GetQuestTemplate(exclude_Id);
1035 if (!IsQuestRewarded(exclude_Id) || (qExcludeInfo->IsSeasonal() && SatisfyQuestSeasonal(qExcludeInfo, false)))
1036 {
1037 if (msg)
1039 return false;
1040 }
1041 }
1042 return true;
1043 }
1044
1045 // If any of the negative previous quests active, return true
1046 if (*iter < 0 && GetQuestStatus(prevId) != QUEST_STATUS_NONE)
1047 {
1048 // skip one-from-all exclusive group
1049 if (qPrevInfo->GetExclusiveGroup() >= 0)
1050 return true;
1051
1052 // each-from-all exclusive group (< 0)
1053 // can be start if only all quests in prev quest exclusive group active
1054 ObjectMgr::ExclusiveQuestGroupsBounds range(sObjectMgr->mExclusiveQuestGroups.equal_range(qPrevInfo->GetExclusiveGroup()));
1055
1056 for (; range.first != range.second; ++range.first)
1057 {
1058 uint32 exclude_Id = range.first->second;
1059
1060 // skip checked quest id, only state of other quests in group is interesting
1061 if (exclude_Id == prevId)
1062 continue;
1063
1064 // alternative quest from group also must be active
1065 if (GetQuestStatus(exclude_Id) != QUEST_STATUS_NONE)
1066 {
1067 if (msg)
1069 return false;
1070 }
1071 }
1072 return true;
1073 }
1074 }
1075 }
1076
1077 // Has only positive prev. quests in non-rewarded state
1078 // and negative prev. quests in non-active state
1079 if (msg)
1081
1082 return false;
1083}
int32 GetExclusiveGroup() const
Definition QuestDef.h:251

References Quest::GetExclusiveGroup(), GetQuestStatus(), INVALIDREASON_DONT_HAVE_REQ, IsQuestRewarded(), Quest::IsSeasonal(), Quest::prevQuests, QUEST_STATUS_NONE, SatisfyQuestSeasonal(), SendCanTakeQuestResponse(), and sObjectMgr.

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestRace()

bool Player::SatisfyQuestRace ( Quest const *  qInfo,
bool  msg 
) const
1104{
1105 uint32 reqraces = qInfo->GetAllowableRaces();
1106 if (reqraces == 0)
1107 return true;
1108 if ((reqraces & getRaceMask()) == 0)
1109 {
1110 if (msg)
1112 return false;
1113 }
1114 return true;
1115}
@ INVALIDREASON_QUEST_FAILED_WRONG_RACE
Definition QuestDef.h:50

References Quest::GetAllowableRaces(), Unit::getRaceMask(), INVALIDREASON_QUEST_FAILED_WRONG_RACE, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestReputation()

bool Player::SatisfyQuestReputation ( Quest const *  qInfo,
bool  msg 
) const
1118{
1119 uint32 fIdMin = qInfo->GetRequiredMinRepFaction(); //Min required rep
1120 if (fIdMin && GetReputationMgr().GetReputation(fIdMin) < qInfo->GetRequiredMinRepValue())
1121 {
1122 if (msg)
1124 return false;
1125 }
1126
1127 uint32 fIdMax = qInfo->GetRequiredMaxRepFaction(); //Max required rep
1128 if (fIdMax && GetReputationMgr().GetReputation(fIdMax) >= qInfo->GetRequiredMaxRepValue())
1129 {
1130 if (msg)
1132 return false;
1133 }
1134
1135 // ReputationObjective2 does not seem to be an objective requirement but a requirement
1136 // to be able to accept the quest
1137 uint32 fIdObj = qInfo->GetRepObjectiveFaction2();
1138 if (fIdObj && GetReputationMgr().GetReputation(fIdObj) >= qInfo->GetRepObjectiveValue2())
1139 {
1140 if (msg)
1142 return false;
1143 }
1144
1145 return true;
1146}

References Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue2(), GetReputation(), GetReputationMgr(), Quest::GetRequiredMaxRepFaction(), Quest::GetRequiredMaxRepValue(), Quest::GetRequiredMinRepFaction(), Quest::GetRequiredMinRepValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestSeasonal()

bool Player::SatisfyQuestSeasonal ( Quest const *  qInfo,
bool  msg 
) const
1312{
1313 if (!qInfo->IsSeasonal() || m_seasonalquests.empty())
1314 return true;
1315
1316 // cppcheck-suppress mismatchingContainers
1317 Player::SeasonalEventQuestMap::iterator itr = ((Player*)this)->m_seasonalquests.find(qInfo->GetEventIdForQuest());
1318
1319 if (itr == m_seasonalquests.end() || itr->second.empty())
1320 return true;
1321
1322 // if not found in cooldown list
1323 return itr->second.find(qInfo->GetQuestId()) == itr->second.end();
1324}

References Quest::GetEventIdForQuest(), Quest::GetQuestId(), Quest::IsSeasonal(), and m_seasonalquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), GetQuestRewardStatus(), GetQuestStatus(), SatisfyQuestExclusiveGroup(), and SatisfyQuestPreviousQuest().

◆ SatisfyQuestSkill()

bool Player::SatisfyQuestSkill ( Quest const *  qInfo,
bool  msg 
) const
948{
949 uint32 skill = qInfo->GetRequiredSkill();
950
951 // skip 0 case RequiredSkill
952 if (skill == 0)
953 return true;
954
955 // check skill value
956 if (GetBaseSkillValue(skill) < qInfo->GetRequiredSkillValue())
957 {
958 if (msg)
960
961 return false;
962 }
963
964 return true;
965}

References GetBaseSkillValue(), Quest::GetRequiredSkill(), Quest::GetRequiredSkillValue(), INVALIDREASON_DONT_HAVE_REQ, and SendCanTakeQuestResponse().

Referenced by CanSeeStartQuest(), and CanTakeQuest().

◆ SatisfyQuestStatus()

bool Player::SatisfyQuestStatus ( Quest const *  qInfo,
bool  msg 
) const
1149{
1150 if (GetQuestStatus(qInfo->GetQuestId()) != QUEST_STATUS_NONE)
1151 {
1152 if (msg)
1154 return false;
1155 }
1156 return true;
1157}
@ INVALIDREASON_QUEST_ALREADY_ON
Definition QuestDef.h:53

References Quest::GetQuestId(), GetQuestStatus(), INVALIDREASON_QUEST_ALREADY_ON, QUEST_STATUS_NONE, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest(), and WorldSession::HandlePushQuestToParty().

◆ SatisfyQuestTimed()

bool Player::SatisfyQuestTimed ( Quest const *  qInfo,
bool  msg 
) const
1173{
1174 if (!m_timedquests.empty() && qInfo->HasSpecialFlag(QUEST_SPECIAL_FLAGS_TIMED))
1175 {
1176 if (msg)
1178 return false;
1179 }
1180 return true;
1181}
@ INVALIDREASON_QUEST_ONLY_ONE_TIMED
Definition QuestDef.h:52

References Quest::HasSpecialFlag(), INVALIDREASON_QUEST_ONLY_ONE_TIMED, m_timedquests, QUEST_SPECIAL_FLAGS_TIMED, and SendCanTakeQuestResponse().

Referenced by CanTakeQuest().

◆ SatisfyQuestWeek()

bool Player::SatisfyQuestWeek ( Quest const *  qInfo,
bool  msg 
) const
1303{
1304 if (!qInfo->IsWeekly() || m_weeklyquests.empty())
1305 return true;
1306
1307 // if not found in cooldown list
1308 return m_weeklyquests.find(qInfo->GetQuestId()) == m_weeklyquests.end();
1309}

References Quest::GetQuestId(), Quest::IsWeekly(), and m_weeklyquests.

Referenced by CanRewardQuest(), CanSeeStartQuest(), CanTakeQuest(), and SatisfyQuestExclusiveGroup().

◆ SaveGoldToDB()

void Player::SaveGoldToDB ( CharacterDatabaseTransaction  trans)
7141{
7143 stmt->SetData(0, GetMoney());
7144 stmt->SetData(1, GetGUID().GetCounter());
7145 trans->Append(stmt);
7146}
@ CHAR_UDP_CHAR_MONEY
Definition CharacterDatabase.h:429

References CHAR_UDP_CHAR_MONEY, CharacterDatabase, Object::GetGUID(), GetMoney(), and PreparedStatementBase::SetData().

Referenced by WorldSession::HandleMailTakeMoney(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), and SaveInventoryAndGoldToDB().

◆ SaveHealthBeforeDuel()

void Player::SaveHealthBeforeDuel ( )
inline

◆ SaveInventoryAndGoldToDB()

void Player::SaveInventoryAndGoldToDB ( CharacterDatabaseTransaction  trans)
7135{
7136 _SaveInventory(trans);
7137 SaveGoldToDB(trans);
7138}
void SaveGoldToDB(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7140
void _SaveInventory(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7254

References _SaveInventory(), and SaveGoldToDB().

Referenced by WorldSession::HandleAcceptTradeOpcode(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleMailTakeItem(), WorldSession::HandleOpenWrappedItemCallback(), WorldSession::HandleSendMail(), WorldSession::HandleWrapItemOpcode(), and RefundItem().

◆ SaveManaBeforeDuel()

void Player::SaveManaBeforeDuel ( )
inline

◆ SavePositionInDB() [1/2]

void Player::SavePositionInDB ( uint32  mapid,
float  x,
float  y,
float  z,
float  o,
uint32  zone,
ObjectGuid  guid 
)
static

◆ SavePositionInDB() [2/2]

void Player::SavePositionInDB ( WorldLocation const &  loc,
uint16  zoneId,
ObjectGuid  guid,
CharacterDatabaseTransaction  trans 
)
static
100{
102
103 stmt->SetData(0, loc.GetPositionX());
104 stmt->SetData(1, loc.GetPositionY());
105 stmt->SetData(2, loc.GetPositionZ());
106 stmt->SetData(3, loc.GetOrientation());
107 stmt->SetData(4, uint16(loc.GetMapId()));
108 stmt->SetData(5, zoneId);
109 stmt->SetData(6, guid.GetCounter());
110
111 CharacterDatabase.ExecuteOrAppend(trans, stmt);
112}

References CHAR_UPD_CHARACTER_POSITION, CharacterDatabase, ObjectGuid::GetCounter(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and PreparedStatementBase::SetData().

◆ SaveRecallPosition()

◆ SaveToDB() [1/2]

◆ SaveToDB() [2/2]

void Player::SaveToDB ( CharacterDatabaseTransaction  trans,
bool  create,
bool  logout 
)
7073{
7074 // delay auto save at any saves (manual, in code, or autosave)
7075 m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE);
7076
7077 //lets allow only players in world to be saved
7079 {
7081 return;
7082 }
7083
7084 // pussywizard: full save now, so clear partial additional saves
7087
7088 // first save/honor gain after midnight will also update the player's honor fields
7090
7091 LOG_DEBUG("entities.unit", "The value of player {} at save: ", m_name);
7093
7094 if (!create)
7095 sScriptMgr->OnPlayerSave(this);
7096
7097 _SaveCharacter(create, trans);
7098
7099 if (m_mailsUpdated) //save mails only when needed
7100 _SaveMail(trans);
7101
7102 _SaveEntryPoint(trans);
7103 _SaveInventory(trans);
7104 _SaveQuestStatus(trans);
7105 _SaveDailyQuestStatus(trans);
7109 _SaveTalents(trans);
7110 _SaveSpells(trans);
7111 _SaveSpellCooldowns(trans, logout);
7112 _SaveActions(trans);
7113 _SaveAuras(trans, logout);
7114 _SaveSkills(trans);
7115 m_achievementMgr->SaveToDB(trans);
7116 m_reputationMgr->SaveToDB(trans);
7117 _SaveEquipmentSets(trans);
7118 GetSession()->SaveTutorialsData(trans); // changed only while character in game
7119 _SaveGlyphs(trans);
7121 _SavePlayerSettings(trans);
7122
7123 // check if stats should only be saved on logout
7124 // save stats can be out of transaction
7126 _SaveStats(trans);
7127
7128 // save pet (hunter pet level and experience and all type pets health/mana).
7129 if (Pet* pet = GetPet())
7130 pet->SavePetToDB(PET_SAVE_AS_CURRENT);
7131}
@ CONFIG_STATS_SAVE_ONLY_ON_LOGOUT
Definition WorldConfig.h:29
void SaveToDB(CharacterDatabaseTransaction trans)
Definition AchievementMgr.cpp:562
bool IsBeingTeleportedFar() const
Definition Player.h:2092
void _SaveMonthlyQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7629
void _SaveTalents(CharacterDatabaseTransaction trans)
Definition Player.cpp:15142
void _SaveDailyQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7534
void _SaveSpells(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7707
void _SaveCharacter(bool create, CharacterDatabaseTransaction trans)
Definition Player.cpp:14799
void _SaveSkills(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7651
void _SaveEquipmentSets(CharacterDatabaseTransaction trans)
Definition Player.cpp:14665
void _SaveGlyphs(CharacterDatabaseTransaction trans)
Definition Player.cpp:15098
void _SaveMail(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7392
void _SaveQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7467
void _SaveAuras(CharacterDatabaseTransaction trans, bool logout)
Definition PlayerStorage.cpp:7196
void _SaveSeasonalQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7595
void _SaveInstanceTimeRestrictions(CharacterDatabaseTransaction trans)
Definition Player.cpp:15988
void _SavePlayerSettings(CharacterDatabaseTransaction trans)
Definition PlayerSettings.cpp:144
void _SaveWeeklyQuestStatus(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7572
void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout)
Definition Player.cpp:3635
void _SaveEntryPoint(CharacterDatabaseTransaction trans)
Definition Player.cpp:14716
void _SaveStats(CharacterDatabaseTransaction trans)
Definition PlayerStorage.cpp:7754
void SaveToDB(CharacterDatabaseTransaction trans)
Definition ReputationMgr.cpp:628
bool isLogingOut() const
Is the user engaged in a log out process?
Definition WorldSession.h:447
void SaveTutorialsData(CharacterDatabaseTransaction trans)
Definition WorldSession.cpp:980

References _SaveActions(), _SaveAuras(), _SaveCharacter(), _SaveDailyQuestStatus(), _SaveEntryPoint(), _SaveEquipmentSets(), _SaveGlyphs(), _SaveInstanceTimeRestrictions(), _SaveInventory(), _SaveMail(), _SaveMonthlyQuestStatus(), _SavePlayerSettings(), _SaveQuestStatus(), _SaveSeasonalQuestStatus(), _SaveSkills(), _SaveSpellCooldowns(), _SaveSpells(), _SaveStats(), _SaveTalents(), _SaveWeeklyQuestStatus(), CONFIG_INTERVAL_SAVE, CONFIG_STATS_SAVE_ONLY_ON_LOGOUT, DELAYED_SAVE_PLAYER, GetPet(), GetSession(), IsBeingTeleportedFar(), WorldSession::isLogingOut(), LOG_DEBUG, m_achievementMgr, m_additionalSaveMask, m_additionalSaveTimer, m_mailsUpdated, WorldObject::m_name, m_nextSave, m_reputationMgr, m_session, outDebugValues(), PET_SAVE_AS_CURRENT, AchievementMgr::SaveToDB(), ReputationMgr::SaveToDB(), WorldSession::SaveTutorialsData(), ScheduleDelayedOperation(), sScriptMgr, sWorld, and UpdateHonorFields().

◆ Say() [1/2]

void Player::Say ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles said message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9409{
9410 std::string _text(text);
9411 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_SAY, language, _text))
9412 {
9413 return;
9414 }
9415
9416 sScriptMgr->OnPlayerChat(this, CHAT_MSG_SAY, language, _text);
9417
9418 WorldPacket data;
9419 ChatHandler::BuildChatPacket(data, CHAT_MSG_SAY, language, this, this, _text);
9420
9421 SendDirectMessage(&data);
9422
9423 // Special handling for messages, do not use visibility map for stealthed units
9424 Acore::MessageDistDeliverer notifier(this, &data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), false, nullptr, true);
9425 Cell::VisitObjects(this, notifier, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY));
9426}
@ CHAT_MSG_SAY
Definition SharedDefines.h:3403
@ CONFIG_LISTEN_RANGE_SAY
Definition WorldConfig.h:150
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:265
Definition GridNotifiers.h:100
static void VisitObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:165

References ChatHandler::BuildChatPacket(), CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, SendDirectMessage(), sScriptMgr, sWorld, and Cell::VisitObjects().

Referenced by Unit::HandleDummyAuraProc(), WorldSession::HandleMessagechatOpcode(), npc_brewfest_bark_trigger::MoveInLineOfSight(), npc_jungle_punch_target::npc_jungle_punch_targetAI::SpellHit(), and boss_headless_horseman::UpdateAI().

◆ Say() [2/2]

void Player::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9429{
9430 Talk(textId, CHAT_MSG_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
9431}
Talk
Definition hyjal.cpp:82

References CHAT_MSG_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ ScheduleDelayedOperation()

void Player::ScheduleDelayedOperation ( uint32  operation)
inline
2100 {
2101 if (operation < DELAYED_END)
2102 m_DelayedOperations |= operation;
2103 }
@ DELAYED_END
Definition Player.h:905

References DELAYED_END, and m_DelayedOperations.

Referenced by Battleground::RemovePlayerAtLeave(), ResurectUsingRequestData(), SaveToDB(), and TeleportToEntryPoint().

◆ SendActionButtons()

void Player::SendActionButtons ( uint32  state) const
5571{
5572 LOG_DEBUG("entities.player", "Sending Action Buttons for {} spec {}", GetGUID().ToString(), m_activeSpec);
5573
5575 data << uint8(state);
5576 /*
5577 state can be 0, 1, 2
5578 0 - Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
5579 1 - Used in any SMSG_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
5580 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
5581 */
5582 if (state != 2)
5583 {
5584 for (uint8 button = 0; button < MAX_ACTION_BUTTONS; ++button)
5585 {
5586 ActionButtonList::const_iterator itr = m_actionButtons.find(button);
5587 if (itr != m_actionButtons.end() && itr->second.uState != ACTIONBUTTON_DELETED)
5588 data << uint32(itr->second.packedData);
5589 else
5590 data << uint32(0);
5591 }
5592 }
5593
5594 SendDirectMessage(&data);
5595 LOG_DEBUG("entities.player", "Action Buttons for {} spec {} Sent", GetGUID().ToString(), m_activeSpec);
5596}
@ SMSG_ACTION_BUTTONS
Definition Opcodes.h:327

References ACTIONBUTTON_DELETED, Object::GetGUID(), LOG_DEBUG, m_actionButtons, m_activeSpec, MAX_ACTION_BUTTONS, SendDirectMessage(), SMSG_ACTION_BUTTONS, and Position::ToString().

Referenced by ActivateSpec(), WorldSession::HandleLoadActionsSwitchSpec(), LoadActions(), and SendInitialActionButtons().

◆ SendAttackSwingBadFacingAttack()

void Player::SendAttackSwingBadFacingAttack ( )
147{
149 SendDirectMessage(&data);
150}
@ SMSG_ATTACKSWING_BADFACING
Definition Opcodes.h:356

References SendDirectMessage(), and SMSG_ATTACKSWING_BADFACING.

Referenced by Update().

◆ SendAttackSwingCancelAttack()

◆ SendAttackSwingCantAttack()

void Player::SendAttackSwingCantAttack ( )
135{
137 SendDirectMessage(&data);
138}
@ SMSG_ATTACKSWING_CANT_ATTACK
Definition Opcodes.h:359

References SendDirectMessage(), and SMSG_ATTACKSWING_CANT_ATTACK.

◆ SendAttackSwingDeadTarget()

void Player::SendAttackSwingDeadTarget ( )
129{
131 SendDirectMessage(&data);
132}
@ SMSG_ATTACKSWING_DEADTARGET
Definition Opcodes.h:358

References SendDirectMessage(), and SMSG_ATTACKSWING_DEADTARGET.

◆ SendAttackSwingNotInRange()

void Player::SendAttackSwingNotInRange ( )
79{
81 SendDirectMessage(&data);
82}
@ SMSG_ATTACKSWING_NOTINRANGE
Definition Opcodes.h:355

References SendDirectMessage(), and SMSG_ATTACKSWING_NOTINRANGE.

Referenced by Update().

◆ SendAutoRepeatCancel()

void Player::SendAutoRepeatCancel ( Unit target)
153{
155 data << target->GetPackGUID(); // may be it's target guid
156 SendMessageToSet(&data, true);
157}
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_CANCEL_AUTO_REPEAT
Definition Opcodes.h:698

References Object::GetPackGUID(), SendMessageToSet(), PackedGuid::size(), and SMSG_CANCEL_AUTO_REPEAT.

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), and Unit::InterruptSpell().

◆ SendBattlefieldWorldStates()

void Player::SendBattlefieldWorldStates ( )

Send misc stuff that needs to be sent on every login, like the battle timers.

8918{
8920 if (sWorld->getIntConfig(CONFIG_WINTERGRASP_ENABLE) == 1)
8921 {
8922 if (BattlefieldWG* wg = (BattlefieldWG*)sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG))
8923 {
8924 wg->SendUpdateWorldStates(this);
8925 }
8926 }
8927}
@ CONFIG_WINTERGRASP_ENABLE
Definition WorldConfig.h:280
Definition BattlefieldWG.h:253

References BATTLEFIELD_BATTLEID_WG, CONFIG_WINTERGRASP_ENABLE, sBattlefieldMgr, and sWorld.

Referenced by SendInitWorldStates().

◆ SendBGWeekendWorldStates()

void Player::SendBGWeekendWorldStates ( )
8903{
8904 for (uint32 i = 1; i < sBattlemasterListStore.GetNumRows(); ++i)
8905 {
8906 BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(i);
8907 if (bl && bl->HolidayWorldStateId)
8908 {
8911 else
8913 }
8914 }
8915}
DBCStorage< BattlemasterListEntry > sBattlemasterListStore(BattlemasterListEntryfmt)
static bool IsBGWeekend(BattlegroundTypeId bgTypeId)
Definition BattlegroundMgr.cpp:910
void SendUpdateWorldState(uint32 variable, uint32 value) const
Definition PlayerUpdates.cpp:2226
Definition DBCStructure.h:604
uint32 HolidayWorldStateId
Definition DBCStructure.h:612
uint32 id
Definition DBCStructure.h:605

References BattlemasterListEntry::HolidayWorldStateId, BattlemasterListEntry::id, BattlegroundMgr::IsBGWeekend(), sBattlemasterListStore, and SendUpdateWorldState().

Referenced by SendInitWorldStates().

◆ SendBuyError()

void Player::SendBuyError ( BuyResult  msg,
Creature creature,
uint32  item,
uint32  param 
)
4064{
4065 LOG_DEBUG("network", "WORLD: Sent SMSG_BUY_FAILED");
4066 WorldPacket data(SMSG_BUY_FAILED, (8 + 4 + 4 + 1));
4067 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4068 data << uint32(item);
4069 if (param > 0)
4070 data << uint32(param);
4071 data << uint8(msg);
4072 SendDirectMessage(&data);
4073}
@ SMSG_BUY_FAILED
Definition Opcodes.h:451

References ObjectGuid::Empty, Object::GetGUID(), LOG_DEBUG, SendDirectMessage(), and SMSG_BUY_FAILED.

Referenced by BuyItemFromVendorSlot(), WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendBuyErrorCommand(), WorldSession::HandlePetitionBuyOpcode(), npc_experience::OnGossipSelect(), OnGossipSelect(), ProcessCastaction(), ProcessUnlearnAction(), and resetTalents().

◆ SendCanTakeQuestResponse()

◆ SendCinematicStart()

void Player::SendCinematicStart ( uint32  CinematicSequenceId) const
5717{
5719 data << uint32(CinematicSequenceId);
5720 SendDirectMessage(&data);
5721 if (CinematicSequencesEntry const* sequence = sCinematicSequencesStore.LookupEntry(CinematicSequenceId))
5722 {
5723 _cinematicMgr->SetActiveCinematicCamera(sequence->cinematicCamera);
5724 }
5725}
DBCStorage< CinematicSequencesEntry > sCinematicSequencesStore(CinematicSequencesEntryfmt)
void SetActiveCinematicCamera(uint32 cinematicCameraId=0)
Definition CinematicMgr.h:41
@ SMSG_TRIGGER_CINEMATIC
Definition Opcodes.h:280
Definition DBCStructure.h:713

References _cinematicMgr, sCinematicSequencesStore, SendDirectMessage(), CinematicMgr::SetActiveCinematicCamera(), and SMSG_TRIGGER_CINEMATIC.

Referenced by debug_commandscript::HandleDebugPlayCinematicCommand(), WorldSession::HandlePlayerLoginFromDB(), and GameObject::Use().

◆ SendClearCooldown()

void Player::SendClearCooldown ( uint32  spell_id,
Unit target 
)

◆ SendCooldownEvent()

void Player::SendCooldownEvent ( SpellInfo const *  spellInfo,
uint32  itemId = 0,
Spell spell = nullptr,
bool  setCooldown = true 
)
11128{
11129 // start cooldowns at server side, if any
11130 if (setCooldown)
11131 AddSpellAndCategoryCooldowns(spellInfo, itemId, spell);
11132
11133 // Send activate cooldown timer (possible 0) at client side
11134 WorldPacket data(SMSG_COOLDOWN_EVENT, 4 + 8);
11135 data << uint32(spellInfo->Id);
11136 data << GetGUID();
11137 SendDirectMessage(&data);
11138}
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10929
@ SMSG_COOLDOWN_EVENT
Definition Opcodes.h:339

References AddSpellAndCategoryCooldowns(), Object::GetGUID(), SpellInfo::Id, SendDirectMessage(), and SMSG_COOLDOWN_EVENT.

Referenced by Spell::_handle_finish_phase(), Aura::_UnapplyForTarget(), Spell::finish(), Unit::RemoveGameObject(), Unit::SetMinion(), and UpdatePotionCooldown().

◆ SendCorpseReclaimDelay()

void Player::SendCorpseReclaimDelay ( uint32  delay)
13025{
13027 data << uint32(delay);
13028 SendDirectMessage(&data);
13029}
@ SMSG_CORPSE_RECLAIM_DELAY
Definition Opcodes.h:647

References SendDirectMessage(), and SMSG_CORPSE_RECLAIM_DELAY.

Referenced by BuildPlayerRepop(), and KillPlayer().

◆ SendDirectMessage()

void Player::SendDirectMessage ( WorldPacket const *  data) const
5712{
5713 m_session->SendPacket(data);
5714}
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:252

References m_session, and WorldSession::SendPacket().

Referenced by Pet::_LoadSpellCooldowns(), Guild::_SendBankList(), _StoreOrEquipNewItem(), Group::AddMember(), InstanceMap::AddPlayerToMap(), AddRunePower(), addSpell(), AddSpellAndCategoryCooldowns(), Creature::AddSpellCooldown(), AddSpellMod(), ApplyEquipCooldown(), TotemAI::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), BindToInstance(), Group::BroadcastPacket(), Group::BroadcastReadyCheck(), SocialMgr::BroadcastToFriendListers(), BuildPlayerRepop(), CharmSpellInitialize(), CheckDuelDistance(), ConvertRune(), Object::DestroyForPlayer(), Group::Disband(), DoRandomRoll(), DuelComplete(), Spell::EffectBind(), Spell::EffectDuel(), Spell::EffectPlayMusic(), Spell::EffectSummonPlayer(), Spell::EffectSummonRaFFriend(), EquipItem(), BGQueueInviteEvent::Execute(), BGQueueRemoveEvent::Execute(), SendEncounterUnit::Execute(), GetAurasForTarget(), ChannelMgr::GetChannel(), GiveLevel(), spell_madrigosa_activate_barrier::HandleActivateObject(), spell_madrigosa_deactivate_barrier::HandleActivateObject(), WorldSession::HandleArenaTeamInviteOpcode(), AuraEffect::HandleAuraSetVehicle(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleChatIgnoredOpcode(), debug_commandscript::HandleDebugCooldownCommand(), debug_commandscript::HandleDebugSendOpcodeCommand(), spell_gen_spirit_healer_res::HandleDummy(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupDeclineOpcode(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), Guild::HandleInviteMember(), modify_commandscript::HandleModifySpellCommand(), WorldSession::HandleOfferPetitionOpcode(), spell_pvp_trinket_wotf_shared_cd::HandleScript(), misc_commandscript::HandleSkirmishCommand(), BattlegroundQueue::InviteGroupToBG(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), Unit::JumpTo(), Unit::Kill(), Unit::KnockbackFrom(), Pet::learnSpell(), GameObject::ModifyHealth(), ModifySpellCooldown(), npc_wg_demolisher_engineer::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), Acore::LocalizedPacketDo< Builder >::operator()(), Acore::LocalizedPacketListDo< Builder >::operator()(), CreatureTextLocalizer< Builder >::operator()(), InstanceMap::PermBindAllPlayers(), PetSpellInitialize(), WorldObject::PlayDirectMusic(), WorldObject::PlayDirectSound(), WorldObject::PlayDistanceSound(), Battleground::PlayerAddedToBGCheckIfBGIsRunning(), MapMgr::PlayerCannotEnter(), PossessSpellInitialize(), ProhibitSpellSchool(), RefundItem(), AchievementMgr::RemoveCriteriaProgress(), Group::RemoveMember(), RemovePet(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), AchievementMgr::Reset(), ResurrectPlayer(), ResyncRunes(), RewardHonor(), SatisfyQuestLog(), Say(), SendActionButtons(), AchievementMgr::SendAllAchievementData(), BattlegroundMgr::SendAreaSpiritHealerQueryOpcode(), Battlefield::SendAreaSpiritHealerQueryOpcode(), SendAttackSwingBadFacingAttack(), SendAttackSwingCancelAttack(), SendAttackSwingCantAttack(), SendAttackSwingDeadTarget(), SendAttackSwingNotInRange(), SendBuyError(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), SendCanTakeQuestResponse(), Spell::SendCastResult(), SendCinematicStart(), SendClearCooldown(), Unit::SendComboPoints(), SendCooldownEvent(), SendCorpseReclaimDelay(), AchievementMgr::SendCriteriaUpdate(), SendDuelCountdown(), SendDungeonDifficulty(), SendDurabilityLoss(), SendEquipError(), SendEquipmentSetList(), SendExplorationExperience(), Weather::SendFineWeatherUpdateToPlayer(), ReputationMgr::SendForceReactions(), SocialMgr::SendFriendStatus(), SendInitialPacketsAfterAddToMap(), SendInitialPacketsBeforeAddToMap(), ReputationMgr::SendInitialReputations(), SendInitialSpells(), Map::SendInitSelf(), Map::SendInitTransports(), SendInitWorldStates(), BattlefieldWG::SendInitWorldStatesTo(), SendInstanceResetWarning(), SendLearnPacket(), SendLogXPGain(), SendLoot(), Group::SendLootAllPassed(), SendLootError(), SendLootRelease(), Group::SendLootRoll(), Group::SendLootRollWon(), Group::SendLootStartRoll(), Group::SendLootStartRollToPlayer(), SendMailResult(), Unit::SendMeleeAttackStart(), SendMessageToSet(), SendMessageToSetInRange(), SendMirrorTimer(), Unit::SendMovementFeatherFall(), Unit::SendMovementHover(), Unit::SendMovementWaterWalking(), SendMovieStart(), SendNewItem(), SendNewMail(), CreatureTextMgr::SendNonChatPacket(), AutobroadcastMgr::SendNotificationAnnouncement(), SendNotifyLootItemRemoved(), SendNotifyLootMoneyRemoved(), Acore::MessageDistDeliverer::SendPacket(), Acore::MessageDistDelivererToHostile::SendPacket(), Unit::SendPetActionFeedback(), Unit::SendPetAIReaction(), Spell::SendPetCastResult(), WorldObject::SendPlayMusic(), SendProficiency(), SendPushToPartyResponse(), SendQuestComplete(), SendQuestConfirmAccept(), SendQuestFailed(), SendQuestGiverStatusMultiple(), SendQuestReward(), SendQuestTimerFailed(), SendQuestUpdateAddCreatureOrGo(), SendQuestUpdateAddItem(), SendQuestUpdateAddPlayer(), lfg::LFGMgr::SendRaidBrowserCachedList(), SendRaidDifficulty(), SendRaidInfo(), SendRefundInfo(), SendRemoveControlBar(), Map::SendRemoveTransports(), SendResetFailedNotify(), SendResetInstanceFailed(), SendResetInstanceSuccess(), AchievementMgr::SendRespondInspectAchievements(), Spell::SendResurrectRequest(), SendSavedInstances(), SendSellError(), WorldSessionMgr::SendServerMessage(), PlayerSocial::SendSocialList(), Unit::SendSpellNonMeleeReflectLog(), ReputationMgr::SendState(), SendTalentsInfoData(), SendTalentWipeConfirm(), Unit::SendTameFailure(), SendTaxiNodeStatusMultiple(), SendTeleportAckPacket(), Item::SendTimeUpdate(), Acore::VisibleNotifier::SendToSelf(), SendTransferAborted(), BattlegroundSA::SendTransportInit(), BattlegroundSA::SendTransportsRemove(), Item::SendUpdateSockets(), Group::SendUpdateToPlayer(), Object::SendUpdateToPlayer(), SendUpdateWorldState(), BattlefieldWG::SendUpdateWorldStateMessage(), ReputationMgr::SendVisible(), Weather::SendWeatherUpdateToPlayer(), ChatHandler::SendWorldTextOptional(), Map::SendZoneDynamicInfo(), Map::SendZoneMessage(), Map::SendZoneWeather(), SetBindPoint(), SetClientControl(), SetEquipmentSet(), SetMovement(), Unit::SetOwnerGUID(), Unit::SetStandState(), SetTitle(), StopMirrorTimer(), TeleportTo(), TextEmote(), Pet::unlearnSpell(), AuctionHouseSearcher::Update(), GameObject::Update(), UpdateHomebindTime(), Group::UpdatePlayerOutOfRange(), UpdateTriggerVisibility(), GameObject::Use(), VehicleSpellInitialize(), Acore::MessageDistDeliverer::Visit(), Whisper(), Unit::Whisper(), Unit::Whisper(), Whisper(), and Yell().

◆ SendDuelCountdown()

void Player::SendDuelCountdown ( uint32  counter)
15467{
15469 data << uint32(counter); // seconds
15470 SendDirectMessage(&data);
15471}
@ SMSG_DUEL_COUNTDOWN
Definition Opcodes.h:725

References SendDirectMessage(), and SMSG_DUEL_COUNTDOWN.

Referenced by WorldSession::HandleDuelAcceptedOpcode().

◆ SendDungeonDifficulty()

void Player::SendDungeonDifficulty ( bool  IsInGroup)

◆ SendDurabilityLoss()

void Player::SendDurabilityLoss ( )

◆ SendEnchantmentDurations()

void Player::SendEnchantmentDurations ( )
4733{
4734 for (EnchantDurationList::const_iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4735 {
4736 GetSession()->SendItemEnchantTimeUpdate(GetGUID(), itr->item->GetGUID(), itr->slot, uint32(itr->leftduration) / 1000);
4737 }
4738}

References Object::GetGUID(), GetSession(), m_enchantDuration, and WorldSession::SendItemEnchantTimeUpdate().

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendEquipError()

void Player::SendEquipError ( InventoryResult  msg,
Item pItem,
Item pItem2 = nullptr,
uint32  itemid = 0 
)
4021{
4022 LOG_DEBUG("network", "WORLD: Sent SMSG_INVENTORY_CHANGE_FAILURE ({})", msg);
4024 data << uint8(msg);
4025
4026 if (msg != EQUIP_ERR_OK)
4027 {
4028 data << (pItem ? pItem->GetGUID() : ObjectGuid::Empty);
4029 data << (pItem2 ? pItem2->GetGUID() : ObjectGuid::Empty);
4030 data << uint8(0); // bag type subclass, used with EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM and EQUIP_ERR_ITEM_DOESNT_GO_INTO_BAG2
4031
4032 switch (msg)
4033 {
4036 {
4037 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4038 data << uint32(proto ? proto->RequiredLevel : 0);
4039 break;
4040 }
4041 case EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM: // no idea about this one...
4042 {
4043 data << ObjectGuid::Empty; // item guid
4044 data << uint32(0); // slot
4045 data << ObjectGuid::Empty; // container
4046 break;
4047 }
4051 {
4052 ItemTemplate const* proto = pItem ? pItem->GetTemplate() : sObjectMgr->GetItemTemplate(itemid);
4053 data << uint32(proto ? proto->ItemLimitCategory : 0);
4054 break;
4055 }
4056 default:
4057 break;
4058 }
4059 }
4060 SendDirectMessage(&data);
4061}
@ EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED
Definition Item.h:131
@ EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM
Definition Item.h:127
@ EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW
Definition Item.h:133
@ SMSG_INVENTORY_CHANGE_FAILURE
Definition Opcodes.h:304
uint32 RequiredLevel
Definition ItemTemplate.h:636

References ObjectGuid::Empty, EQUIP_ERR_CANT_EQUIP_LEVEL_I, EQUIP_ERR_EVENT_AUTOEQUIP_BIND_CONFIRM, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED, EQUIP_ERR_OK, EQUIP_ERR_PURCHASE_LEVEL_TOO_LOW, Object::GetGUID(), Item::GetTemplate(), ItemTemplate::ItemLimitCategory, LOG_DEBUG, ItemTemplate::RequiredLevel, SendDirectMessage(), SMSG_INVENTORY_CHANGE_FAILURE, and sObjectMgr.

Referenced by _StoreOrEquipNewItem(), AutoStoreLoot(), BuyItemFromVendorSlot(), CanAddQuest(), CanRewardQuest(), CanRewardQuest(), CastItemUseSpell(), Spell::CheckItems(), Group::CountTheRoll(), Spell::DoCreateItem(), Spell::EffectRechargeManaGem(), GiveQuestSourceItem(), WorldSession::HandleAcceptTradeOpcode(), misc_commandscript::HandleAddItemSetCommand(), WorldSession::HandleAutoBankItemOpcode(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), AuraEffect::HandleChannelDeathItem(), debug_commandscript::HandleDebugSendEquipErrorCommand(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleGuildBankSwapItems(), WorldSession::HandleOpenItemOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleReadItem(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSocketOpcode(), WorldSession::HandleSplitItemOpcode(), WorldSession::HandleSwapInvItemOpcode(), WorldSession::HandleSwapItem(), WorldSession::HandleUseItemOpcode(), WorldSession::HandleWrapItemOpcode(), ModifyMoney(), item_petrov_cluster_bombs::OnUse(), item_only_for_flight::OnUse(), item_incendiary_explosives::OnUse(), item_captured_frog::OnUse(), ProcessUnlearnAction(), SetAmmo(), SplitItem(), StoreLootItem(), SwapItem(), and TakeQuestSourceItem().

◆ SendEquipmentSetList()

void Player::SendEquipmentSetList ( )
14595{
14596 uint32 count = 0;
14598 std::size_t count_pos = data.wpos();
14599 data << uint32(count); // count placeholder
14600 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14601 {
14602 if (itr->second.state == EQUIPMENT_SET_DELETED)
14603 continue;
14604
14605 data.appendPackGUID(itr->second.Guid);
14606 data << uint32(itr->first);
14607 data << itr->second.Name;
14608 data << itr->second.IconName;
14609 for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
14610 {
14611 // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item
14612 if (itr->second.IgnoreMask & (1 << i))
14613 data.appendPackGUID(uint64(1));
14614 else // xinef: send proper data (do not append 0 with high guid)
14615 data.appendPackGUID(itr->second.Items[i] ? itr->second.Items[i].GetRawValue() : uint64(0));
14616 }
14617
14618 ++count; // client have limit but it checked at loading and set
14619 }
14620 data.put<uint32>(count_pos, count);
14621 SendDirectMessage(&data);
14622}
@ SMSG_EQUIPMENT_SET_LIST
Definition Opcodes.h:1242

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_DELETED, EQUIPMENT_SLOT_END, m_EquipmentSets, ByteBuffer::put(), SendDirectMessage(), SMSG_EQUIPMENT_SET_LIST, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendExplorationExperience()

void Player::SendExplorationExperience ( uint32  Area,
uint32  Experience 
)
160{
162 data << uint32(Area);
163 data << uint32(Experience);
164 SendDirectMessage(&data);
165}
@ SMSG_EXPLORATION_EXPERIENCE
Definition Opcodes.h:534

References SendDirectMessage(), and SMSG_EXPLORATION_EXPERIENCE.

Referenced by CheckAreaExploreAndOutdoor().

◆ SendInitialActionButtons()

void Player::SendInitialActionButtons ( ) const
inline

◆ SendInitialPacketsAfterAddToMap()

void Player::SendInitialPacketsAfterAddToMap ( )
11646{
11648
11651
11652 CastSpell(this, 836, true); // LOGINEFFECT
11653
11654 // set some aura effects that send packet to player client after add player to map
11655 // SendMessageToSet not send it to player not it map, only for aura that not changed anything at re-apply
11656 // same auras state lost at far teleport, send it one more time in this case also
11657 static const AuraType auratypes[] =
11658 {
11662 };
11663 for (AuraType const* itr = &auratypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
11664 {
11665 Unit::AuraEffectList const& auraList = GetAuraEffectsByType(*itr);
11666 if (!auraList.empty())
11667 auraList.front()->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
11668 }
11669
11670 // Fix mount, update block gets messed somewhere
11671 {
11673 {
11674 AddAura(GetMountBlockId(), this);
11675 SetMountBlockId(0);
11676 }
11677 }
11678
11679 // update zone
11680 uint32 newzone, newarea;
11681 GetZoneAndAreaId(newzone, newarea);
11682 UpdateZone(newzone, newarea); // also call SendInitWorldStates();
11683
11684 WorldPacket setCompoundState(SMSG_MULTIPLE_MOVES, 100);
11685 setCompoundState << uint32(0); // size placeholder
11686
11687 // manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
11688 if (IsImmobilizedState())
11689 {
11690 uint32 const counter = GetSession()->GetOrderCounter();
11691 setCompoundState << uint8(2 + GetPackGUID().size() + 4);
11692 setCompoundState << uint16(SMSG_FORCE_MOVE_ROOT);
11693 setCompoundState << GetPackGUID();
11694 setCompoundState << uint32(counter);
11696 }
11697
11699 {
11700 uint32 const counter = GetSession()->GetOrderCounter();
11701 setCompoundState << uint8(2 + GetPackGUID().size() + 4);
11702 setCompoundState << uint16(SMSG_MOVE_FEATHER_FALL);
11703 setCompoundState << GetPackGUID();
11704 setCompoundState << uint32(counter);
11706 }
11707
11709 {
11710 uint32 const counter = GetSession()->GetOrderCounter();
11711 setCompoundState << uint8(2 + GetPackGUID().size() + 4);
11712 setCompoundState << uint16(SMSG_MOVE_WATER_WALK);
11713 setCompoundState << GetPackGUID();
11714 setCompoundState << uint32(counter);
11716 }
11717
11719 {
11720 uint32 const counter = GetSession()->GetOrderCounter();
11721 setCompoundState << uint8(2 + GetPackGUID().size() + 4);
11722 setCompoundState << uint16(SMSG_MOVE_SET_HOVER);
11723 setCompoundState << GetPackGUID();
11724 setCompoundState << uint32(counter);
11726 }
11727
11728 // TODO: Pending mount protocol
11729
11730 if (setCompoundState.size() > 4)
11731 {
11732 setCompoundState.put<uint32>(0, setCompoundState.size() - 4);
11733 SendDirectMessage(&setCompoundState);
11734 }
11735
11736 SendEnchantmentDurations(); // must be after add to map
11737 SendItemDurations(); // must be after add to map
11740
11741 // raid downscaling - send difficulty to player
11742 if (GetMap()->IsRaid())
11743 {
11745 {
11748 }
11749 }
11751 SendRaidDifficulty(GetGroup() != nullptr);
11752}
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void UpdateVisibilityForPlayer(bool mapChange=false)
Definition PlayerUpdates.cpp:1588
uint32 GetMountBlockId()
Definition Player.h:2604
void SendTaxiNodeStatusMultiple()
Definition Player.cpp:10536
Difficulty GetStoredRaidDifficulty() const
Definition Player.h:1918
void SendEnchantmentDurations()
Definition PlayerStorage.cpp:4732
void SendItemDurations()
Definition PlayerStorage.cpp:4748
void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty=-1)
Definition PlayerMisc.cpp:177
bool HasMountedAura() const
Definition Unit.h:1754
void SendTimeSync()
Definition WorldSession.cpp:1432
uint32 GetOrderCounter() const
Definition WorldSession.h:600
void IncrementOrderCounter()
Definition WorldSession.h:601
void ResetTimeSync()
Definition WorldSession.cpp:1426
@ SMSG_MOVE_FEATHER_FALL
Definition Opcodes.h:272
@ SMSG_MOVE_SET_HOVER
Definition Opcodes.h:274
@ SMSG_MOVE_WATER_WALK
Definition Opcodes.h:252
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_MULTIPLE_MOVES
Definition Opcodes.h:1340

References Unit::AddAura(), AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Unit::CastSpell(), Unit::GetAuraEffectsByType(), GetDifficulty(), GetGroup(), WorldObject::GetMap(), GetMountBlockId(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), GetRaidDifficulty(), GetSession(), GetStoredRaidDifficulty(), WorldObject::GetZoneAndAreaId(), Unit::HasAuraType(), Unit::HasMountedAura(), WorldSession::IncrementOrderCounter(), isBeingLoaded(), Unit::IsImmobilizedState(), ByteBuffer::put(), WorldSession::ResetTimeSync(), SendDirectMessage(), SendEnchantmentDurations(), SendItemDurations(), SendQuestGiverStatusMultiple(), SendRaidDifficulty(), SendTaxiNodeStatusMultiple(), WorldSession::SendTimeSync(), SetMountBlockId(), ByteBuffer::size(), SMSG_FORCE_MOVE_ROOT, SMSG_MOVE_FEATHER_FALL, SMSG_MOVE_SET_HOVER, SMSG_MOVE_WATER_WALK, SMSG_MULTIPLE_MOVES, SPELL_AURA_FEATHER_FALL, SPELL_AURA_FLY, SPELL_AURA_HOVER, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_NONE, SPELL_AURA_SAFE_FALL, SPELL_AURA_TRANSFORM, SPELL_AURA_WATER_WALK, StoreRaidMapDifficulty(), UpdateVisibilityForPlayer(), and UpdateZone().

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialPacketsBeforeAddToMap()

void Player::SendInitialPacketsBeforeAddToMap ( )

Pass 'this' as argument because we're not stored in ObjectAccessor yet

11589{
11592
11593 // guild bank list?
11594
11595 // Homebind
11596 WorldPacket data(SMSG_BINDPOINTUPDATE, 5 * 4);
11597 data << m_homebindX << m_homebindY << m_homebindZ;
11598 data << (uint32) m_homebindMapId;
11599 data << (uint32) m_homebindAreaId;
11600 SendDirectMessage(&data);
11601
11602 // SMSG_SET_PROFICIENCY
11603 // SMSG_SET_PCT_SPELL_MODIFIER
11604 // SMSG_SET_FLAT_SPELL_MODIFIER
11605 // SMSG_UPDATE_AURA_DURATION
11606
11607 SendTalentsInfoData(false);
11608
11609 // SMSG_INSTANCE_DIFFICULTY
11610 data.Initialize(SMSG_INSTANCE_DIFFICULTY, 4 + 4);
11611 data << uint32(GetMap()->GetDifficulty());
11612 data << uint32(GetMap()->GetEntry()->IsDynamicDifficultyMap() && GetMap()->IsHeroic()); // Raid dynamic difficulty
11613 SendDirectMessage(&data);
11614
11616
11617 data.Initialize(SMSG_SEND_UNLEARN_SPELLS, 4);
11618 data << uint32(0); // count, for (count) uint32;
11619 SendDirectMessage(&data);
11620
11624
11626
11627 data.Initialize(SMSG_LOGIN_SETTIMESPEED, 4 + 4 + 4);
11628 data.AppendPackedTime(GameTime::GetGameTime().count());
11629 data << float(0.01666667f); // game speed
11630 data << uint32(0); // added in 3.1.2
11631 SendDirectMessage(&data);
11632
11633 GetReputationMgr().SendForceReactions(); // SMSG_SET_FORCED_REACTIONS
11634
11635 // SMSG_TALENTS_INFO x 2 for pet (unspent points and talents in separate packets...)
11636 // SMSG_PET_GUIDS
11637 // SMSG_UPDATE_WORLD_STATE
11638 // SMSG_POWER_UPDATE
11639
11640 SetMover(this);
11641
11642 sScriptMgr->OnPlayerSendInitialPacketsBeforeAddToMap(this, data);
11643}
void SendAllAchievementData() const
Definition AchievementMgr.cpp:2377
void SendSocialList(Player *player, uint32 flags)
Definition SocialMgr.cpp:124
void SendInitialSpells()
Definition Player.cpp:2751
PlayerSocial * GetSocial()
Definition Player.h:1143
void SendInitialActionButtons() const
Definition Player.h:1838
void SendEquipmentSetList()
Definition Player.cpp:14594
void SetMover(Unit *target)
Definition Player.cpp:12943
void SendInitialReputations()
Definition ReputationMgr.cpp:211
void SendForceReactions()
Definition ReputationMgr.cpp:165
@ SMSG_INSTANCE_DIFFICULTY
Definition Opcodes.h:857
@ SMSG_BINDPOINTUPDATE
Definition Opcodes.h:371
@ SMSG_LOGIN_SETTIMESPEED
Definition Opcodes.h:96
@ SMSG_SEND_UNLEARN_SPELLS
Definition Opcodes.h:1084

References ByteBuffer::AppendPackedTime(), GetDifficulty(), Object::GetEntry(), GameTime::GetGameTime(), WorldObject::GetMap(), GetReputationMgr(), GetSocial(), WorldPacket::Initialize(), m_achievementMgr, m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, m_reputationMgr, AchievementMgr::SendAllAchievementData(), SendDirectMessage(), SendEquipmentSetList(), ReputationMgr::SendForceReactions(), SendInitialActionButtons(), ReputationMgr::SendInitialReputations(), SendInitialSpells(), PlayerSocial::SendSocialList(), SendTalentsInfoData(), SetMover(), SMSG_BINDPOINTUPDATE, SMSG_INSTANCE_DIFFICULTY, SMSG_LOGIN_SETTIMESPEED, SMSG_SEND_UNLEARN_SPELLS, SOCIAL_FLAG_ALL, and sScriptMgr.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendInitialSpells()

void Player::SendInitialSpells ( )
2752{
2753 uint32 curTime = GameTime::GetGameTimeMS().count();
2755
2756 uint16 spellCount = 0;
2757
2758 WorldPacket data(SMSG_INITIAL_SPELLS, (1 + 2 + 4 * m_spells.size() + 2 + m_spellCooldowns.size() * (4 + 2 + 2 + 4 + 4)));
2759 data << uint8(0);
2760
2761 std::size_t countPos = data.wpos();
2762 data << uint16(spellCount); // spell count placeholder
2763
2764 for (PlayerSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
2765 {
2766 if (itr->second->State == PLAYERSPELL_REMOVED)
2767 continue;
2768
2769 if (!itr->second->Active || !itr->second->IsInSpec(GetActiveSpec()))
2770 continue;
2771
2772 data << uint32(itr->first);
2773 data << uint16(0); // it's not slot id
2774
2775 ++spellCount;
2776 }
2777
2778 // Added spells from glyphs too (needed by spell tooltips)
2779 for (uint8 i = 0; i < MAX_GLYPH_SLOT_INDEX; ++i)
2780 {
2781 if (uint32 glyph = GetGlyph(i))
2782 {
2783 if (GlyphPropertiesEntry const* glyphEntry = sGlyphPropertiesStore.LookupEntry(glyph))
2784 {
2785 data << uint32(glyphEntry->SpellId);
2786 data << uint16(0); // it's not slot id
2787
2788 ++spellCount;
2789 }
2790 }
2791 }
2792
2793 // xinef: we have to send talents, but not those on m_spells list
2794 for (PlayerTalentMap::iterator itr = m_talents.begin(); itr != m_talents.end(); ++itr)
2795 {
2796 if (itr->second->State == PLAYERSPELL_REMOVED)
2797 continue;
2798
2799 // xinef: remove all active talent auras
2800 if (!(itr->second->specMask & GetActiveSpecMask()))
2801 continue;
2802
2803 // xinef: already sent from m_spells
2804 if (itr->second->inSpellBook)
2805 continue;
2806
2807 data << uint32(itr->first);
2808 data << uint16(0); // it's not slot id
2809
2810 ++spellCount;
2811 }
2812
2813 data.put<uint16>(countPos, spellCount); // write real count value
2814
2815 uint16 spellCooldowns = m_spellCooldowns.size();
2816 data << uint16(spellCooldowns);
2817 for (SpellCooldowns::const_iterator itr = m_spellCooldowns.begin(); itr != m_spellCooldowns.end(); ++itr)
2818 {
2819 if (!itr->second.needSendToClient)
2820 continue;
2821
2822 SpellInfo const* sEntry = sSpellMgr->GetSpellInfo(itr->first);
2823 if (!sEntry)
2824 continue;
2825
2826 data << uint32(itr->first);
2827
2828 data << uint16(itr->second.itemid); // cast item id
2829 data << uint16(itr->second.category); // spell category
2830
2831 // send infinity cooldown in special format
2832 if (itr->second.end >= infTime)
2833 {
2834 data << uint32(1); // cooldown
2835 data << uint32(0x80000000); // category cooldown
2836 continue;
2837 }
2838
2839 uint32 cooldown = itr->second.end > curTime ? itr->second.end - curTime : 0;
2840 data << uint32(itr->second.category ? 0 : cooldown); // cooldown
2841 data << uint32(itr->second.category ? cooldown : 0); // category cooldown
2842 }
2843
2844 SendDirectMessage(&data);
2845}
@ SMSG_INITIAL_SPELLS
Definition Opcodes.h:328

References GetActiveSpec(), GetActiveSpecMask(), GameTime::GetGameTimeMS(), GetGlyph(), infinityCooldownDelayCheck, m_spellCooldowns, m_spells, m_talents, MAX_GLYPH_SLOT_INDEX, PLAYERSPELL_REMOVED, ByteBuffer::put(), SendDirectMessage(), sGlyphPropertiesStore, SMSG_INITIAL_SPELLS, sSpellMgr, and ByteBuffer::wpos().

Referenced by SendInitialPacketsBeforeAddToMap().

◆ SendInitWorldStates()

void Player::SendInitWorldStates ( uint32  zoneId,
uint32  areaId 
)
8247{
8248 // data depends on zoneid/mapid...
8249 uint32 mapId = GetMapId();
8250 Battleground* battleground = GetBattleground();
8251 OutdoorPvP* outdoorPvP = sOutdoorPvPMgr->GetOutdoorPvPToZoneId(zoneId);
8252 InstanceScript* instance = GetInstanceScript();
8253 Battlefield* battlefield = sBattlefieldMgr->GetBattlefieldToZoneId(zoneId);
8254
8255 LOG_DEBUG("network", "Sending SMSG_INIT_WORLD_STATES to Map: {}, Zone: {}", mapId, zoneId);
8256
8258 packet.MapID = mapId;
8259 packet.ZoneID = zoneId;
8260 packet.AreaID = areaId;
8261
8262 packet.Worldstates.reserve(8);
8264 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_AZSHARA, 0);
8267 packet.Worldstates.emplace_back(WORLD_STATE_SCOURGE_INVASION_TANARIS, 0);
8269
8270 // 7 1 - Arena season in progress, 0 - end of season
8272 // 8 Arena season id
8273 packet.Worldstates.emplace_back(WORLD_STATE_ARENA_SEASON_ID, sArenaSeasonMgr->GetCurrentSeason());
8274
8275 if (mapId == MAP_OUTLAND)
8276 {
8277 packet.Worldstates.reserve(3);
8279 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_MAX, 15);
8280 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT, 15);
8281 }
8282
8284 {
8285 Player::bgZoneIdToFillWorldStates[zoneId](battleground, packet);
8286 }
8287 else
8288 {
8289 // insert <field> <value>
8290 switch (zoneId)
8291 {
8292 case AREA_DUN_MOROGH:
8293 case AREA_WETLANDS:
8294 case AREA_ELWYNN_FOREST:
8295 case AREA_LOCH_MODAN:
8296 case AREA_WESTFALL:
8297 case AREA_SEARING_GORGE:
8299 case AREA_IRONFORGE:
8300 case AREA_DEEPRUN_TRAM:
8302 break;
8304 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_EP)
8305 outdoorPvP->FillInitialWorldStates(packet);
8306 else
8307 {
8308 packet.Worldstates.reserve(32);
8310 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_A, 0);
8311 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_H, 0);
8313 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_N, 50);
8314 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N, 1);
8317 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_7, 0);
8318 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_8, 0);
8319 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_A, 0);
8320 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_H, 0);
8321 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_A, 0);
8322 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_H, 0);
8323 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_0, 0);
8324 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_1, 0);
8325 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_A, 0);
8326 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_H, 0);
8327 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_EASTWALLTOWER_N, 1);
8328 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N, 1);
8331 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_2, 0);
8332 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_3, 0);
8333 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_NORTHPASSTOWER_A, 0);
8334 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_NORTHPASSTOWER_H, 0);
8335 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N, 1);
8337 //packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_4, 1);
8338 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_5, 0);
8339 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_UNK_6, 0);
8340 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_A, 0);
8341 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H, 0);
8342
8343 break;
8344 case AREA_SILITHUS:
8345 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_SI)
8346 outdoorPvP->FillInitialWorldStates(packet);
8347 else
8348 {
8349 packet.Worldstates.reserve(3);
8350 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_SI_GATHERED_A, 0);
8351 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_SI_GATHERED_H, 0);
8352 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_SI_SILITHYST_MAX, 0);
8353 }
8354 // unknown, aq opening?
8355 packet.Worldstates.reserve(4);
8356 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_N, 0);
8357 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_S, 0);
8358 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_SW, 0);
8359 packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_E, 0);
8360 break;
8362 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_AV)
8363 battleground->FillInitialWorldStates(packet);
8364 else
8365 {
8366 packet.Worldstates.reserve(75);
8370 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_A_A, 0);
8375 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_N_MINE_N, 1);
8381 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_5, 0);
8384 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_4, 0);
8389 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_3, 1);
8401 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_1, 0);
8402 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_0, 0);
8410 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_UNK_2, 0);
8419 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_N_MINE_H, 0);
8420 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_N_MINE_A, 0);
8421 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_S_MINE_N, 1);
8422 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_S_MINE_H, 0);
8423 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_S_MINE_A, 0);
8439 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_H_A, 0);
8440 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_H_C, 0);
8441 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_A_C, 1);
8442 }
8443 break;
8444 case AREA_WARSONG_GULCH:
8445 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_WS)
8446 battleground->FillInitialWorldStates(packet);
8447 else
8448 {
8449 packet.Worldstates.reserve(8);
8452 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_UNK_0, 0);
8453 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_UNK_1, 0);
8454 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_UNK_2, 2);
8458 }
8459 break;
8460 case AREA_ARATHI_BASIN:
8461 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_AB)
8462 battleground->FillInitialWorldStates(packet);
8463 else
8464 {
8465 packet.Worldstates.reserve(32);
8478 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_RESOURCES_MAX, 1600);
8494 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_FARM_ICON, 1);
8496 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_UNK, 2);
8497 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING, 1400); // warning limit (1400)
8498 }
8499 break;
8501 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_EY)
8502 battleground->FillInitialWorldStates(packet);
8503 else
8504 {
8505 packet.Worldstates.reserve(32);
8514 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_2, 0);
8515 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_1, 0);
8528 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_FLAG, 1);
8533 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_0, 142);
8537 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_EY_UNK_3, 379);
8538 // missing unknowns
8539 }
8540 break;
8541 // any of these needs change! the client remembers the prev setting!
8542 // ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
8544 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_HP)
8545 outdoorPvP->FillInitialWorldStates(packet);
8546 else
8547 {
8548 packet.Worldstates.reserve(16);
8551 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_BROKENHILL_N, 0);
8552 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_BROKENHILL_H, 1);
8553 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_BROKENHILL_A, 0);
8554 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_OVERLOOK_N, 0);
8555 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_OVERLOOK_H, 1);
8556 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_OVERLOOK_A, 0);
8557 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_H, 0);
8558 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_A, 0);
8559 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_N, 100);
8562 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_N, 0);
8563 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_A, 0);
8564 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_H, 1);
8565 }
8566 break;
8567 case AREA_NAGRAND:
8568 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_NA)
8569 outdoorPvP->FillInitialWorldStates(packet);
8570 else
8571 {
8572 packet.Worldstates.reserve(28);
8575 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_MAX, 0);
8576 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT, 0);
8579 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_SLIDER_N, 0);
8590 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_H, 0);
8591 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_A, 0);
8594 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_H, 0);
8595 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_A, 0);
8596 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_NEUTRAL, 0);
8597 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_A, 0);
8598 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_H, 0);
8599 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_HORDE, 0);
8601 }
8602 break;
8604 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_TF)
8605 outdoorPvP->FillInitialWorldStates(packet);
8606 else
8607 {
8608 packet.Worldstates.reserve(28);
8610 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_N, 20);
8612 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H, 0);
8613 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_A, 5);
8615 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_14, 0);
8616 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_13, 0);
8617 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_12, 0);
8618 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_11, 0);
8619 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_10, 0);
8620 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_09, 0);
8621 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_08, 0);
8622 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_07, 0);
8623 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_06, 0);
8624 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_15, 0);
8625 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_05, 0);
8626 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_04, 0);
8627 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_03, 0);
8628 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_02, 0);
8629 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_01, 0);
8630 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_TOWER_NUM_00, 0);
8637 }
8638 break;
8639 case AREA_ZANGARMARSH:
8640 if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_ZM)
8641 outdoorPvP->FillInitialWorldStates(packet);
8642 else
8643 {
8644 packet.Worldstates.reserve(26);
8648 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UNK, 1);
8649 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_N, 0);
8650 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_H, 1);
8651 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_A, 0);
8652 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_H, 1);
8653 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_A, 0);
8654 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_N, 0);
8655 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_N, 0);
8656 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_H, 1);
8657 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_A, 0);
8661 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_N, 0);
8662 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_H, 1);
8663 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_A, 0);
8664 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_N, 0);
8665 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_H, 1);
8666 packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_A, 0);
8671 }
8672 break;
8673 case AREA_NAGRAND_ARENA:
8674 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_NA)
8675 battleground->FillInitialWorldStates(packet);
8676 else
8677 {
8678 packet.Worldstates.reserve(3);
8682 }
8683 break;
8685 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_BE)
8686 battleground->FillInitialWorldStates(packet);
8687 else
8688 {
8689 packet.Worldstates.reserve(3);
8693 }
8694 break;
8696 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_RL)
8697 battleground->FillInitialWorldStates(packet);
8698 else
8699 {
8700 packet.Worldstates.reserve(3);
8704 }
8705 break;
8706 case AREA_DALARAN_ARENA:
8707 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_DS)
8708 battleground->FillInitialWorldStates(packet);
8709 else
8710 {
8711 packet.Worldstates.reserve(3);
8715 }
8716 break;
8718 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA)
8719 battleground->FillInitialWorldStates(packet);
8720 else
8721 {
8722 packet.Worldstates.reserve(24);
8726 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_SA_BLUE_GATE, 0);
8727 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_SA_RED_GATE, 0);
8732
8733 // End Round timer, example: 19:59 -> A:BC
8736 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_SA_TIMER_MINUTES, 0); // A
8737
8750 // missing unknowns
8751 }
8752 break;
8754 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_RV)
8755 battleground->FillInitialWorldStates(packet);
8756 else
8757 {
8758 packet.Worldstates.reserve(3);
8762 }
8763 break;
8765 if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_IC)
8766 battleground->FillInitialWorldStates(packet);
8767 else
8768 {
8769 packet.Worldstates.reserve(18);
8786 packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_IC_UNK, 1);
8788 }
8789 break;
8791 if (instance)
8792 instance->FillInitialWorldStates(packet);
8793 else
8794 {
8795 packet.Worldstates.reserve(3);
8799 }
8800 break;
8802 if (instance && mapId == MAP_ICECROWN_CITADEL)
8803 instance->FillInitialWorldStates(packet);
8804 else
8805 {
8806 packet.Worldstates.reserve(5);
8812 }
8813 break;
8815 if (instance && mapId == MAP_THE_CULLING_OF_STRATHOLME)
8816 instance->FillInitialWorldStates(packet);
8817 else
8818 {
8819 packet.Worldstates.reserve(5);
8825 }
8826 break;
8827 case AREA_THE_OCULUS:
8828 if (instance && mapId == MAP_THE_OCULUS)
8829 instance->FillInitialWorldStates(packet);
8830 else
8831 {
8832 packet.Worldstates.reserve(2);
8835 }
8836 break;
8837 case AREA_ULDUAR:
8838 if (instance && mapId == MAP_ULDUAR)
8839 instance->FillInitialWorldStates(packet);
8840 else
8841 {
8842 packet.Worldstates.reserve(2);
8845 }
8846 break;
8848 if (instance)
8849 instance->FillInitialWorldStates(packet);
8850 else
8851 {
8852 packet.Worldstates.reserve(3);
8853 packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_SHOW, 0);
8854 packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_PRISON_STATE, 100);
8855 packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_WAVE_COUNT, 0);
8856 }
8857 break;
8859 if (instance && mapId == MAP_HALLS_OF_REFLECTION)
8860 instance->FillInitialWorldStates(packet);
8861 else
8862 {
8863 packet.Worldstates.reserve(2);
8866 }
8867 break;
8868 case AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE: // (DK starting zone)
8869 // Get Mograine, GUID and ENTRY should NEVER change
8870 if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
8871 {
8872 if (CreatureAI* mograineAI = mograine->AI())
8873 {
8874 packet.Worldstates.reserve(6);
8875 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_DEFENDERS_COUNT, mograineAI->GetData(3590));
8876 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SCOURGE_COUNT, mograineAI->GetData(3591));
8877 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SOLDIERS_ENABLE, mograineAI->GetData(3592));
8878 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_ENABLE, mograineAI->GetData(3603));
8879 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_TIME, mograineAI->GetData(3604));
8880 packet.Worldstates.emplace_back(WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_EVENT_BEGIN_ENABLE, mograineAI->GetData(3605));
8881 }
8882 }
8883 break;
8884 case AREA_WINTERGRASP:
8885 if (battlefield && battlefield->GetTypeId() == BATTLEFIELD_WG)
8886 {
8887 battlefield->FillInitialWorldStates(packet);
8888 break;
8889 }
8890 default:
8891 break;
8892 }
8893 }
8894 }
8895
8896 sWorldState->FillInitialWorldStates(packet, zoneId, areaId);
8897 SendDirectMessage(packet.Write());
8900}
@ MAP_THE_CULLING_OF_STRATHOLME
Definition AreaDefines.h:249
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:265
@ MAP_THE_OCULUS
Definition AreaDefines.h:246
@ MAP_HALLS_OF_REFLECTION
Definition AreaDefines.h:270
@ MAP_OUTLAND
Definition AreaDefines.h:216
@ MAP_ULDUAR
Definition AreaDefines.h:254
@ AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE
Definition AreaDefines.h:147
@ ARENA_THE_RING_OF_VALOR
Definition AreaDefines.h:151
@ AREA_THE_RUBY_SANCTUM
Definition AreaDefines.h:180
@ AREA_WETLANDS
Definition AreaDefines.h:30
@ AREA_IRONFORGE
Definition AreaDefines.h:82
@ AREA_STRAND_OF_THE_ANCIENTS
Definition AreaDefines.h:149
@ AREA_WESTFALL
Definition AreaDefines.h:39
@ AREA_WARSONG_GULCH
Definition AreaDefines.h:92
@ AREA_NAGRAND
Definition AreaDefines.h:99
@ AREA_THE_VIOLET_HOLD
Definition AreaDefines.h:152
@ AREA_RUINS_OF_LORDAERON
Definition AreaDefines.h:136
@ AREA_HALLS_OF_REFLECTION
Definition AreaDefines.h:174
@ AREA_LOCH_MODAN
Definition AreaDefines.h:38
@ AREA_DEEPRUN_TRAM
Definition AreaDefines.h:89
@ AREA_SILITHUS
Definition AreaDefines.h:79
@ AREA_ICECROWN_CITADEL
Definition AreaDefines.h:173
@ AREA_ARATHI_BASIN
Definition AreaDefines.h:93
@ AREA_EASTERN_PLAGUELANDS
Definition AreaDefines.h:53
@ AREA_DUN_MOROGH
Definition AreaDefines.h:25
@ AREA_STORMWIND_CITY
Definition AreaDefines.h:81
@ AREA_THE_CULLING_OF_STRATHOLME
Definition AreaDefines.h:140
@ AREA_NAGRAND_ARENA
Definition AreaDefines.h:115
@ AREA_SHATTRATH_CITY
Definition AreaDefines.h:117
@ AREA_EYE_OF_THE_STORM
Definition AreaDefines.h:130
@ AREA_ALTERAC_VALLEY
Definition AreaDefines.h:90
@ AREA_BLADES_EDGE_ARENA
Definition AreaDefines.h:116
@ AREA_ULDUAR
Definition AreaDefines.h:146
@ AREA_ISLE_OF_CONQUEST
Definition AreaDefines.h:172
@ AREA_DALARAN_ARENA
Definition AreaDefines.h:148
@ AREA_SEARING_GORGE
Definition AreaDefines.h:44
@ AREA_ELWYNN_FOREST
Definition AreaDefines.h:31
@ AREA_ZANGARMARSH
Definition AreaDefines.h:102
@ AREA_THE_OCULUS
Definition AreaDefines.h:145
@ AREA_TEROKKAR_FOREST
Definition AreaDefines.h:100
@ ARENA_SEASON_STATE_IN_PROGRESS
Definition ArenaSeasonMgr.h:29
#define sArenaSeasonMgr
Definition ArenaSeasonMgr.h:124
@ BATTLEFIELD_WG
Definition Battlefield.h:29
@ OUTDOOR_PVP_SI
Definition OutdoorPvP.h:34
@ OUTDOOR_PVP_TF
Definition OutdoorPvP.h:32
@ OUTDOOR_PVP_ZM
Definition OutdoorPvP.h:33
@ OUTDOOR_PVP_EP
Definition OutdoorPvP.h:35
@ OUTDOOR_PVP_NA
Definition OutdoorPvP.h:31
@ OUTDOOR_PVP_HP
Definition OutdoorPvP.h:30
@ BATTLEGROUND_IC
Definition SharedDefines.h:3758
@ BATTLEGROUND_WS
Definition SharedDefines.h:3748
@ BATTLEGROUND_EY
Definition SharedDefines.h:3753
@ BATTLEGROUND_AV
Definition SharedDefines.h:3747
@ BATTLEGROUND_BE
Definition SharedDefines.h:3751
@ BATTLEGROUND_RV
Definition SharedDefines.h:3757
@ BATTLEGROUND_NA
Definition SharedDefines.h:3750
@ BATTLEGROUND_DS
Definition SharedDefines.h:3756
@ BATTLEGROUND_SA
Definition SharedDefines.h:3755
@ BATTLEGROUND_AB
Definition SharedDefines.h:3749
@ BATTLEGROUND_RL
Definition SharedDefines.h:3754
@ WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_N
Definition WorldStateDefines.h:427
@ WORLD_STATE_OPVP_EP_UNK_1
Definition WorldStateDefines.h:388
@ WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_SHOW
Definition WorldStateDefines.h:215
@ WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS
Definition WorldStateDefines.h:32
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_HORDE
Definition WorldStateDefines.h:184
@ WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_H
Definition WorldStateDefines.h:412
@ WORLD_STATE_BATTLEGROUND_SA_TIMER_MINUTES
Definition WorldStateDefines.h:304
@ WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_DISPLAY
Definition WorldStateDefines.h:384
@ WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT
Definition WorldStateDefines.h:474
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_H
Definition WorldStateDefines.h:482
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_ALLIANCE
Definition WorldStateDefines.h:202
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_A
Definition WorldStateDefines.h:107
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_ALLIANCE
Definition WorldStateDefines.h:198
@ WORLD_STATE_AHNQIRAJ_SANDWORM_S
Definition WorldStateDefines.h:510
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_ASSAULTED
Definition WorldStateDefines.h:153
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONFLICT
Definition WorldStateDefines.h:231
@ WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS
Definition WorldStateDefines.h:29
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_ALLIANCE
Definition WorldStateDefines.h:314
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_H
Definition WorldStateDefines.h:498
@ WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_N
Definition WorldStateDefines.h:431
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONTROL
Definition WorldStateDefines.h:228
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_UNCONTROL
Definition WorldStateDefines.h:224
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_CONTROLLED
Definition WorldStateDefines.h:126
@ WORLD_STATE_BATTLEGROUND_SA_RED_GATE
Definition WorldStateDefines.h:311
@ WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_N
Definition WorldStateDefines.h:403
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N
Definition WorldStateDefines.h:365
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_E
Definition WorldStateDefines.h:420
@ WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_SECOND_DIGIT
Definition WorldStateDefines.h:306
@ WORLD_STATE_BATTLEGROUND_SA_PURPLE_GATE
Definition WorldStateDefines.h:310
@ WORLD_STATE_AHNQIRAJ_SANDWORM_E
Definition WorldStateDefines.h:512
@ WORLD_STATE_BATTLEGROUND_SA_YELLOW_GATE
Definition WorldStateDefines.h:326
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_A
Definition WorldStateDefines.h:118
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_DESTROYED
Definition WorldStateDefines.h:133
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_ALLIANCE
Definition WorldStateDefines.h:189
@ WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED
Definition WorldStateDefines.h:567
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_ALLIANCE
Definition WorldStateDefines.h:196
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_UNCONTROL
Definition WorldStateDefines.h:221
@ WORLD_STATE_BATTLEGROUND_AV_AID_H_A
Definition WorldStateDefines.h:99
@ WORLD_STATE_BATTLEGROUND_IC_REFINERY_UNCONTROLLED
Definition WorldStateDefines.h:274
@ WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_N
Definition WorldStateDefines.h:452
@ WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_H
Definition WorldStateDefines.h:426
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SOLDIERS_ENABLE
Definition WorldStateDefines.h:517
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N_A
Definition WorldStateDefines.h:375
@ WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_ALLIANCE_CONTROL
Definition WorldStateDefines.h:219
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_HORDE
Definition WorldStateDefines.h:203
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_UNCONTROL
Definition WorldStateDefines.h:227
@ WORLD_STATE_OPVP_HP_BROKENHILL_A
Definition WorldStateDefines.h:409
@ WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_ALLIANCE
Definition WorldStateDefines.h:325
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_HORDE
Definition WorldStateDefines.h:186
@ WORLD_STATE_BATTLEGROUND_NA_ARENA_GREEN
Definition WorldStateDefines.h:338
@ WORLD_STATE_OPVP_TF_TOWER_NUM_10
Definition WorldStateDefines.h:465
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_C
Definition WorldStateDefines.h:92
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_ASSAULTED
Definition WorldStateDefines.h:146
@ WORLD_STATE_BATTLEGROUND_AV_UNK_4
Definition WorldStateDefines.h:156
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_C
Definition WorldStateDefines.h:108
@ WORLD_STATE_BATTLEGROUND_SA_ENABLE_TIMER
Definition WorldStateDefines.h:307
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_ASSAULTED
Definition WorldStateDefines.h:143
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_EVENT_BEGIN_ENABLE
Definition WorldStateDefines.h:520
@ WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_AMOUNT
Definition WorldStateDefines.h:562
@ WORLD_STATE_BATTLEGROUND_EY_FLAG
Definition WorldStateDefines.h:244
@ WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_RESOURCES
Definition WorldStateDefines.h:240
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_ICON
Definition WorldStateDefines.h:208
@ WORLD_STATE_BATTLEGROUND_BE_ARENA_GOLD
Definition WorldStateDefines.h:332
@ WORLD_STATE_OPVP_TF_UI_TOWERS_CONTROLLED_DISPLAY
Definition WorldStateDefines.h:448
@ WORLD_STATE_BATTLEGROUND_AV_S_MINE_N
Definition WorldStateDefines.h:122
@ WORLD_STATE_OPVP_TF_TOWER_NUM_05
Definition WorldStateDefines.h:459
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_HORDE
Definition WorldStateDefines.h:188
@ WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_READY
Definition WorldStateDefines.h:441
@ WORLD_STATE_BATTLEGROUND_AV_AID_H_C
Definition WorldStateDefines.h:98
@ WORLD_STATE_BATTLEGROUND_EY_UNK_2
Definition WorldStateDefines.h:238
@ WORLD_STATE_OPVP_EP_UNK_3
Definition WorldStateDefines.h:390
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_A
Definition WorldStateDefines.h:492
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_HORDE
Definition WorldStateDefines.h:197
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_A
Definition WorldStateDefines.h:119
@ WORLD_STATE_OPVP_NA_UI_HORDE_GUARDS_SHOW
Definition WorldStateDefines.h:480
@ WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES
Definition WorldStateDefines.h:30
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_A
Definition WorldStateDefines.h:486
@ WORLD_STATE_BATTLEGROUND_WS_UNK_0
Definition WorldStateDefines.h:169
@ WORLD_STATE_BATTLEGROUND_SA_HORDE_ATTACKER
Definition WorldStateDefines.h:308
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_HORDE
Definition WorldStateDefines.h:316
@ WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_OPEN
Definition WorldStateDefines.h:284
@ WORLD_STATE_BATTLEGROUND_AV_N_MINE_N
Definition WorldStateDefines.h:125
@ WORLD_STATE_OPVP_EP_UNK_0
Definition WorldStateDefines.h:387
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_C
Definition WorldStateDefines.h:112
@ WORLD_STATE_OPVP_TF_TOWER_NUM_04
Definition WorldStateDefines.h:458
@ WORLD_STATE_OPVP_SI_SILITHYST_MAX
Definition WorldStateDefines.h:359
@ WORLD_STATE_OPVP_HP_OVERLOOK_N
Definition WorldStateDefines.h:408
@ WORLD_STATE_BATTLEGROUND_IC_HORDE_KEEP_CONTROLLED_H
Definition WorldStateDefines.h:297
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_H
Definition WorldStateDefines.h:487
@ WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_REMAINING
Definition WorldStateDefines.h:551
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_H
Definition WorldStateDefines.h:429
@ WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_N
Definition WorldStateDefines.h:424
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_UNUSED
Definition WorldStateDefines.h:160
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_E
Definition WorldStateDefines.h:419
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_A
Definition WorldStateDefines.h:373
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_DESTROYED
Definition WorldStateDefines.h:136
@ WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_BASE
Definition WorldStateDefines.h:242
@ WORLD_STATE_OPVP_TF_TOWER_NUM_12
Definition WorldStateDefines.h:467
@ WORLD_STATE_BATTLEGROUND_AV_UNK_1
Definition WorldStateDefines.h:91
@ WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER
Definition WorldStateDefines.h:566
@ WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_SECOND_DIGIT
Definition WorldStateDefines.h:446
@ WORLD_STATE_AHNQIRAJ_SANDWORM_N
Definition WorldStateDefines.h:509
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING
Definition WorldStateDefines.h:212
@ WORLD_STATE_OPVP_TF_TOWER_NUM_00
Definition WorldStateDefines.h:454
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_CONTROLLED
Definition WorldStateDefines.h:147
@ WORLD_STATE_BATTLEGROUND_AV_UNK_2
Definition WorldStateDefines.h:134
@ WORLD_STATE_BATTLEGROUND_EY_UNK_3
Definition WorldStateDefines.h:239
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONTROL
Definition WorldStateDefines.h:229
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_ASSAULTED
Definition WorldStateDefines.h:145
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_A
Definition WorldStateDefines.h:103
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_A
Definition WorldStateDefines.h:111
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_ASSAULTED
Definition WorldStateDefines.h:144
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_CONTROLLED
Definition WorldStateDefines.h:129
@ WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_HOURS
Definition WorldStateDefines.h:445
@ WORLD_STATE_VIOLET_HOLD_SHOW
Definition WorldStateDefines.h:572
@ WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_COMMANDERS
Definition WorldStateDefines.h:89
@ WORLD_STATE_BATTLEGROUND_IC_WORKSHOP_UNCONTROLLED
Definition WorldStateDefines.h:258
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_ALLIANCE
Definition WorldStateDefines.h:324
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_ALLIANCE
Definition WorldStateDefines.h:323
@ WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_MAX
Definition WorldStateDefines.h:552
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_HORDE
Definition WorldStateDefines.h:317
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_A
Definition WorldStateDefines.h:484
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_C
Definition WorldStateDefines.h:93
@ WORLD_STATE_BATTLEGROUND_IC_HANGAR_UNCONTROLLED
Definition WorldStateDefines.h:259
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_H
Definition WorldStateDefines.h:374
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_UNUSED
Definition WorldStateDefines.h:140
@ WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_H_WS_OPEN
Definition WorldStateDefines.h:282
@ WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_ALLIANCE
Definition WorldStateDefines.h:192
@ WORLD_STATE_BATTLEGROUND_WS_UNK_1
Definition WorldStateDefines.h:170
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_UNUSED
Definition WorldStateDefines.h:139
@ WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_HORDE_CONTROL
Definition WorldStateDefines.h:220
@ WORLD_STATE_CULLING_OF_STRATHOLME_CRATES_REVEALED
Definition WorldStateDefines.h:556
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_C
Definition WorldStateDefines.h:100
@ WORLD_STATE_BATTLEGROUND_SA_BLUE_GATE
Definition WorldStateDefines.h:312
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_ASSAULTED
Definition WorldStateDefines.h:154
@ WORLD_STATE_BATTLEGROUND_DS_ARENA_SHOW
Definition WorldStateDefines.h:349
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_H
Definition WorldStateDefines.h:381
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_CONTROLLED
Definition WorldStateDefines.h:128
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_UNUSED
Definition WorldStateDefines.h:157
@ WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_A
Definition WorldStateDefines.h:404
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_HORDE
Definition WorldStateDefines.h:182
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_H
Definition WorldStateDefines.h:435
@ WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_POS
Definition WorldStateDefines.h:476
@ WORLD_STATE_BATTLEGROUND_RV_ARENA_SHOW
Definition WorldStateDefines.h:354
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_C
Definition WorldStateDefines.h:101
@ WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_DISPLAY
Definition WorldStateDefines.h:401
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_HORDE
Definition WorldStateDefines.h:201
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_HORDE
Definition WorldStateDefines.h:320
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_A
Definition WorldStateDefines.h:370
@ WORLD_STATE_OPVP_TF_TOWER_NUM_11
Definition WorldStateDefines.h:466
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_CONTROLLED
Definition WorldStateDefines.h:148
@ WORLD_STATE_ICECROWN_CITADEL_EXECUTION_TIME
Definition WorldStateDefines.h:549
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_A
Definition WorldStateDefines.h:110
@ WORLD_STATE_BATTLEGROUND_RL_ARENA_GREEN
Definition WorldStateDefines.h:343
@ WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_POS
Definition WorldStateDefines.h:385
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_ALLIANCE
Definition WorldStateDefines.h:187
@ WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TOGGLE
Definition WorldStateDefines.h:545
@ WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_CLOSED
Definition WorldStateDefines.h:279
@ WORLD_STATE_SCOURGE_INVASION_TANARIS
Definition WorldStateDefines.h:31
@ WORLD_STATE_OPVP_HP_STADIUM_H
Definition WorldStateDefines.h:398
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_A
Definition WorldStateDefines.h:102
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_C
Definition WorldStateDefines.h:113
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_HORDE
Definition WorldStateDefines.h:175
@ WORLD_STATE_BATTLEGROUND_AV_DUNN_CONTROLLED
Definition WorldStateDefines.h:127
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_DESTROYED
Definition WorldStateDefines.h:131
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_MAX
Definition WorldStateDefines.h:193
@ WORLD_STATE_OPVP_HP_STADIUM_N
Definition WorldStateDefines.h:400
@ WORLD_STATE_BATTLEGROUND_EY_UNK_1
Definition WorldStateDefines.h:237
@ WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_LIEUTENANTS
Definition WorldStateDefines.h:88
@ WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_A
Definition WorldStateDefines.h:425
@ WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONFLICT
Definition WorldStateDefines.h:230
@ WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_A
Definition WorldStateDefines.h:362
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONFLICT
Definition WorldStateDefines.h:233
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_DEFENDERS_COUNT
Definition WorldStateDefines.h:515
@ WORLD_STATE_BATTLEGROUND_EY_HORDE_BASE
Definition WorldStateDefines.h:243
@ WORLD_STATE_OPVP_EP_UNK_5
Definition WorldStateDefines.h:392
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_H
Definition WorldStateDefines.h:369
@ WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_A
Definition WorldStateDefines.h:496
@ WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT
Definition WorldStateDefines.h:251
@ WORLD_STATE_OPVP_SI_GATHERED_H
Definition WorldStateDefines.h:358
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_A
Definition WorldStateDefines.h:380
@ WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_READY
Definition WorldStateDefines.h:438
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_ALLIANCE
Definition WorldStateDefines.h:172
@ WORLD_STATE_BATTLEGROUND_AV_UNK_0
Definition WorldStateDefines.h:90
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_A
Definition WorldStateDefines.h:481
@ WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_NOT_READY
Definition WorldStateDefines.h:440
@ WORLD_STATE_BATTLEGROUND_AV_AID_A_A
Definition WorldStateDefines.h:97
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_A
Definition WorldStateDefines.h:489
@ WORLD_STATE_BATTLEGROUND_EY_UNK_0
Definition WorldStateDefines.h:236
@ WORLD_STATE_BATTLEGROUND_SA_GREEN_GATE
Definition WorldStateDefines.h:313
@ WORLD_STATE_OPVP_TF_TOWER_NUM_09
Definition WorldStateDefines.h:464
@ WORLD_STATE_BATTLEGROUND_NA_ARENA_SHOW
Definition WorldStateDefines.h:339
@ WORLD_STATE_OPVP_TF_TOWER_NUM_13
Definition WorldStateDefines.h:468
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_A
Definition WorldStateDefines.h:434
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_DESTROYED
Definition WorldStateDefines.h:138
@ WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN
Definition WorldStateDefines.h:558
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_ICON
Definition WorldStateDefines.h:207
@ WORLD_STATE_BATTLEGROUND_RV_ARENA_GREEN
Definition WorldStateDefines.h:352
@ WORLD_STATE_BATTLEGROUND_AV_N_MINE_A
Definition WorldStateDefines.h:123
@ WORLD_STATE_OPVP_TF_TOWER_NUM_08
Definition WorldStateDefines.h:463
@ WORLD_STATE_OPVP_TF_TOWER_NUM_06
Definition WorldStateDefines.h:461
@ WORLD_STATE_BATTLEGROUND_AB_RESOURCES_HORDE
Definition WorldStateDefines.h:190
@ WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT
Definition WorldStateDefines.h:252
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONFLICT
Definition WorldStateDefines.h:232
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_A
Definition WorldStateDefines.h:94
@ WORLD_STATE_BATTLEGROUND_AB_FARM_ICON
Definition WorldStateDefines.h:209
@ WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_HORDE
Definition WorldStateDefines.h:471
@ WORLD_STATE_SCOURGE_INVASION_WINTERSPRING
Definition WorldStateDefines.h:27
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_CONTROLLED
Definition WorldStateDefines.h:149
@ WORLD_STATE_BATTLEGROUND_WS_UNK_2
Definition WorldStateDefines.h:171
@ WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_HORDE
Definition WorldStateDefines.h:321
@ WORLD_STATE_OPVP_NA_MAP_HALAA_ALLIANCE
Definition WorldStateDefines.h:495
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_ALLIANCE
Definition WorldStateDefines.h:183
@ WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_A_WS_OPEN
Definition WorldStateDefines.h:287
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_H
Definition WorldStateDefines.h:499
@ WORLD_STATE_OPVP_HP_BROKENHILL_N
Definition WorldStateDefines.h:411
@ WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_H_WS_OPEN
Definition WorldStateDefines.h:283
@ WORLD_STATE_ICECROWN_CITADEL_SHOW_ATTEMPTS
Definition WorldStateDefines.h:550
@ WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_A
Definition WorldStateDefines.h:413
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_ASSAULTED
Definition WorldStateDefines.h:152
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_TIME
Definition WorldStateDefines.h:519
@ WORLD_STATE_BATTLEGROUND_AV_S_MINE_H
Definition WorldStateDefines.h:121
@ WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_ALLIANCE
Definition WorldStateDefines.h:315
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N
Definition WorldStateDefines.h:364
@ WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_A
Definition WorldStateDefines.h:95
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_H
Definition WorldStateDefines.h:383
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_E
Definition WorldStateDefines.h:421
@ WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_ALLIANCE
Definition WorldStateDefines.h:470
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_A
Definition WorldStateDefines.h:491
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_HORDE
Definition WorldStateDefines.h:199
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_H
Definition WorldStateDefines.h:485
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_N
Definition WorldStateDefines.h:430
@ WORLD_STATE_OPVP_TF_TOWER_NUM_03
Definition WorldStateDefines.h:457
@ WORLD_STATE_OPVP_EP_UNK_8
Definition WorldStateDefines.h:395
@ WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_HORDE
Definition WorldStateDefines.h:322
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_HORDE
Definition WorldStateDefines.h:205
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_C
Definition WorldStateDefines.h:109
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_CONTROLLED
Definition WorldStateDefines.h:150
@ WORLD_STATE_CULLING_OF_STRATHOLME_SHOW_CRATES
Definition WorldStateDefines.h:555
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_A
Definition WorldStateDefines.h:376
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONTROL
Definition WorldStateDefines.h:222
@ WORLD_STATE_OPVP_EP_UNK_6
Definition WorldStateDefines.h:393
@ WORLD_STATE_OPVP_HP_OVERLOOK_H
Definition WorldStateDefines.h:407
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_A
Definition WorldStateDefines.h:114
@ WORLD_STATE_CULLING_OF_STRATHOLME_WAVE_COUNT
Definition WorldStateDefines.h:557
@ WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_NOT_READY
Definition WorldStateDefines.h:439
@ WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_FIRST_DIGIT
Definition WorldStateDefines.h:447
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_UNUSED
Definition WorldStateDefines.h:158
@ WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_FIRST_DIGIT
Definition WorldStateDefines.h:305
@ WORLD_STATE_OPVP_NA_UI_SLIDER_N
Definition WorldStateDefines.h:478
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_DESTROYED
Definition WorldStateDefines.h:137
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONFLICT
Definition WorldStateDefines.h:235
@ WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H
Definition WorldStateDefines.h:377
@ WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_HORDE
Definition WorldStateDefines.h:246
@ WORLD_STATE_HALLS_OF_REFLECTION_WAVES_ENABLED
Definition WorldStateDefines.h:576
@ WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_A_WS_OPEN
Definition WorldStateDefines.h:285
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_N
Definition WorldStateDefines.h:436
@ WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_DISPLAY
Definition WorldStateDefines.h:451
@ WORLD_STATE_BATTLEGROUND_RL_ARENA_SHOW
Definition WorldStateDefines.h:344
@ WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_DISPLAY
Definition WorldStateDefines.h:477
@ WORLD_STATE_OPVP_TF_TOWER_NUM_01
Definition WorldStateDefines.h:455
@ WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_DESTROYED
Definition WorldStateDefines.h:130
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_N
Definition WorldStateDefines.h:372
@ WORLD_STATE_BATTLEGROUND_AV_UNK_5
Definition WorldStateDefines.h:161
@ WORLD_STATE_OPVP_ZM_UNK
Definition WorldStateDefines.h:437
@ WORLD_STATE_BATTLEGROUND_AV_AID_A_C
Definition WorldStateDefines.h:96
@ WORLD_STATE_AHNQIRAJ_SANDWORM_SW
Definition WorldStateDefines.h:511
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_H
Definition WorldStateDefines.h:500
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_W
Definition WorldStateDefines.h:416
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_ALLIANCE
Definition WorldStateDefines.h:176
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_UNUSED
Definition WorldStateDefines.h:159
@ WORLD_STATE_BATTLEGROUND_AV_DUNS_DESTROYED
Definition WorldStateDefines.h:135
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_C
Definition WorldStateDefines.h:104
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_W
Definition WorldStateDefines.h:417
@ WORLD_STATE_OPVP_NA_UI_GUARDS_MAX
Definition WorldStateDefines.h:475
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_ASSAULTED
Definition WorldStateDefines.h:155
@ WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_POS
Definition WorldStateDefines.h:453
@ WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_A
Definition WorldStateDefines.h:449
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_A
Definition WorldStateDefines.h:115
@ WORLD_STATE_OPVP_TF_TOWER_NUM_07
Definition WorldStateDefines.h:462
@ WORLD_STATE_BATTLEGROUND_AV_ICEWING_UNUSED
Definition WorldStateDefines.h:141
@ WORLD_STATE_BATTLEGROUND_AV_STONEH_UNUSED
Definition WorldStateDefines.h:142
@ WORLD_STATE_VIOLET_HOLD_WAVE_COUNT
Definition WorldStateDefines.h:570
@ WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT_SET
Definition WorldStateDefines.h:249
@ WORLD_STATE_ARENA_SEASON_PROGRESS
Definition WorldStateDefines.h:43
@ WORLD_STATE_OPVP_NA_MAP_HALAA_NEUTRAL
Definition WorldStateDefines.h:493
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_ICON
Definition WorldStateDefines.h:206
@ WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_ALLIANCE
Definition WorldStateDefines.h:185
@ WORLD_STATE_BATTLEGROUND_SA_BONUS_TIMER
Definition WorldStateDefines.h:309
@ WORLD_STATE_OPVP_TF_TOWER_NUM_14
Definition WorldStateDefines.h:469
@ WORLD_STATE_BATTLEGROUND_AV_N_MINE_H
Definition WorldStateDefines.h:124
@ WORLD_STATE_BATTLEGROUND_RV_ARENA_GOLD
Definition WorldStateDefines.h:353
@ WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_POS
Definition WorldStateDefines.h:402
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_C
Definition WorldStateDefines.h:105
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N
Definition WorldStateDefines.h:368
@ WORLD_STATE_OPVP_HP_STADIUM_A
Definition WorldStateDefines.h:399
@ WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_DESTROYED
Definition WorldStateDefines.h:132
@ WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_A
Definition WorldStateDefines.h:382
@ WORLD_STATE_OPVP_HP_BROKENHILL_H
Definition WorldStateDefines.h:410
@ WORLD_STATE_BATTLEGROUND_BE_ARENA_GREEN
Definition WorldStateDefines.h:333
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_H
Definition WorldStateDefines.h:501
@ WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_STATUS
Definition WorldStateDefines.h:216
@ WORLD_STATE_OPVP_NA_MAP_HALAA_HORDE
Definition WorldStateDefines.h:494
@ WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TWILIGHT
Definition WorldStateDefines.h:544
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_ICON
Definition WorldStateDefines.h:210
@ WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_N
Definition WorldStateDefines.h:386
@ WORLD_STATE_HALLS_OF_REFLECTION_WAVE_COUNT
Definition WorldStateDefines.h:575
@ WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_H
Definition WorldStateDefines.h:497
@ WORLD_STATE_BATTLEGROUND_AV_S_MINE_A
Definition WorldStateDefines.h:120
@ WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_N
Definition WorldStateDefines.h:162
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONFLICT
Definition WorldStateDefines.h:234
@ WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_ALLIANCE
Definition WorldStateDefines.h:181
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_HORDE
Definition WorldStateDefines.h:173
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_C
Definition WorldStateDefines.h:117
@ WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_SHOW
Definition WorldStateDefines.h:563
@ WORLD_STATE_BATTLEGROUND_SA_ALLIANCE_DEFENSE_TOKEN
Definition WorldStateDefines.h:318
@ WORLD_STATE_OPVP_EP_UNK_2
Definition WorldStateDefines.h:389
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_HORDE
Definition WorldStateDefines.h:195
@ WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_A
Definition WorldStateDefines.h:422
@ WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_H
Definition WorldStateDefines.h:405
@ WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_A
Definition WorldStateDefines.h:428
@ WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H
Definition WorldStateDefines.h:450
@ WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_W
Definition WorldStateDefines.h:418
@ WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_HORDE
Definition WorldStateDefines.h:191
@ WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_ALLIANCE
Definition WorldStateDefines.h:204
@ WORLD_STATE_ARENA_SEASON_ID
Definition WorldStateDefines.h:46
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_ENABLE
Definition WorldStateDefines.h:518
@ WORLD_STATE_BATTLEGROUND_SA_HORDE_DEFENSE_TOKEN
Definition WorldStateDefines.h:319
@ WORLD_STATE_OPVP_TF_TOWER_NUM_15
Definition WorldStateDefines.h:460
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONTROL
Definition WorldStateDefines.h:226
@ WORLD_STATE_BATTLEGROUND_BE_ARENA_SHOW
Definition WorldStateDefines.h:334
@ WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_MAX
Definition WorldStateDefines.h:174
@ WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_MATERIAL
Definition WorldStateDefines.h:543
@ WORLD_STATE_OPVP_HP_OVERLOOK_A
Definition WorldStateDefines.h:406
@ WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_C
Definition WorldStateDefines.h:116
@ WORLD_STATE_BATTLEGROUND_RL_ARENA_GOLD
Definition WorldStateDefines.h:342
@ WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_H
Definition WorldStateDefines.h:423
@ WORLD_STATE_BATTLEGROUND_EY_HORDE_RESOURCES
Definition WorldStateDefines.h:241
@ WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_H
Definition WorldStateDefines.h:433
@ WORLD_STATE_BATTLEGROUND_IC_UNK
Definition WorldStateDefines.h:256
@ WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONTROL
Definition WorldStateDefines.h:225
@ WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_A_WS_OPEN
Definition WorldStateDefines.h:286
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_A
Definition WorldStateDefines.h:483
@ WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SCOURGE_COUNT
Definition WorldStateDefines.h:516
@ WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_UNCONTROL
Definition WorldStateDefines.h:218
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_A
Definition WorldStateDefines.h:378
@ WORLD_STATE_BATTLEGROUND_IC_QUARRY_UNCONTROLLED
Definition WorldStateDefines.h:269
@ WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_A
Definition WorldStateDefines.h:432
@ WORLD_STATE_SCOURGE_INVASION_AZSHARA
Definition WorldStateDefines.h:28
@ WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_ALLIANCE
Definition WorldStateDefines.h:245
@ WORLD_STATE_BATTLEGROUND_DS_ARENA_GOLD
Definition WorldStateDefines.h:348
@ WORLD_STATE_VIOLET_HOLD_PRISON_STATE
Definition WorldStateDefines.h:571
@ WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_NEUTRAL
Definition WorldStateDefines.h:444
@ WORLD_STATE_OPVP_SI_GATHERED_A
Definition WorldStateDefines.h:357
@ WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_PERCENT_GREY
Definition WorldStateDefines.h:217
@ WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONTROL
Definition WorldStateDefines.h:223
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_A
Definition WorldStateDefines.h:367
@ WORLD_STATE_ICECROWN_CITADEL_SHOW_TIMER
Definition WorldStateDefines.h:548
@ WORLD_STATE_OPVP_EP_NORTHPASSTOWER_H
Definition WorldStateDefines.h:379
@ WORLD_STATE_BATTLEGROUND_IC_DOCKS_UNCONTROLLED
Definition WorldStateDefines.h:264
@ WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_ALLIANCE
Definition WorldStateDefines.h:200
@ WORLD_STATE_BATTLEGROUND_NA_ARENA_GOLD
Definition WorldStateDefines.h:337
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_A
Definition WorldStateDefines.h:488
@ WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN_SHOW
Definition WorldStateDefines.h:559
@ WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_ALLIANCE
Definition WorldStateDefines.h:194
@ WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_H
Definition WorldStateDefines.h:371
@ WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_H
Definition WorldStateDefines.h:490
@ WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_A
Definition WorldStateDefines.h:106
@ WORLD_STATE_BATTLEGROUND_DS_ARENA_GREEN
Definition WorldStateDefines.h:347
@ WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_H
Definition WorldStateDefines.h:363
@ WORLD_STATE_BATTLEGROUND_AB_UNK
Definition WorldStateDefines.h:211
@ WORLD_STATE_OPVP_NA_UI_ALLIANCE_GUARDS_SHOW
Definition WorldStateDefines.h:479
@ WORLD_STATE_OPVP_TF_TOWER_NUM_02
Definition WorldStateDefines.h:456
@ WORLD_STATE_BATTLEGROUND_SA_ANCIENT_GATE
Definition WorldStateDefines.h:327
@ WORLD_STATE_OPVP_EP_UNK_7
Definition WorldStateDefines.h:394
@ WORLD_STATE_BATTLEGROUND_AV_UNK_3
Definition WorldStateDefines.h:151
@ WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT_SET
Definition WorldStateDefines.h:250
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)=0
uint32 GetTypeId()
Definition Battlefield.h:242
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)
Definition Battleground.h:451
BattlegroundTypeId GetBgTypeID(bool GetRandom=false) const
Definition Battleground.h:320
Definition CreatureAI.h:71
Definition InstanceScript.h:143
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)
Definition InstanceScript.h:264
Definition OutdoorPvP.h:186
virtual void FillInitialWorldStates(WorldPackets::WorldState::InitWorldStates &)
Definition OutdoorPvP.h:203
uint32 GetTypeId() const
Definition OutdoorPvP.h:238
void SendBGWeekendWorldStates()
Definition Player.cpp:8902
void SendBattlefieldWorldStates()
Definition Player.cpp:8917
static std::unordered_map< int, bgZoneRef > bgZoneIdToFillWorldStates
Definition Player.h:16163
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1221
Definition WorldStatePackets.h:28
std::vector< WorldStateInfo > Worldstates
Definition WorldStatePackets.h:46
int32 MapID
Definition WorldStatePackets.h:42
int32 AreaID
Definition WorldStatePackets.h:44
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:22
int32 ZoneID
Definition WorldStatePackets.h:43

References AREA_ALTERAC_VALLEY, AREA_ARATHI_BASIN, AREA_BLADES_EDGE_ARENA, AREA_DALARAN_ARENA, AREA_DEEPRUN_TRAM, AREA_DUN_MOROGH, AREA_EASTERN_PLAGUELANDS, AREA_ELWYNN_FOREST, AREA_EYE_OF_THE_STORM, AREA_HALLS_OF_REFLECTION, AREA_HELLFIRE_PENINSULA, AREA_ICECROWN_CITADEL, AREA_IRONFORGE, AREA_ISLE_OF_CONQUEST, AREA_LOCH_MODAN, AREA_NAGRAND, AREA_NAGRAND_ARENA, AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE, AREA_RUINS_OF_LORDAERON, AREA_SEARING_GORGE, AREA_SHATTRATH_CITY, AREA_SILITHUS, AREA_STORMWIND_CITY, AREA_STRAND_OF_THE_ANCIENTS, AREA_TEROKKAR_FOREST, AREA_THE_CULLING_OF_STRATHOLME, AREA_THE_OCULUS, AREA_THE_RUBY_SANCTUM, AREA_THE_VIOLET_HOLD, AREA_ULDUAR, AREA_WARSONG_GULCH, AREA_WESTFALL, AREA_WETLANDS, AREA_WINTERGRASP, AREA_ZANGARMARSH, WorldPackets::WorldState::InitWorldStates::AreaID, ARENA_SEASON_STATE_IN_PROGRESS, ARENA_THE_RING_OF_VALOR, BATTLEFIELD_WG, BATTLEGROUND_AB, BATTLEGROUND_AV, BATTLEGROUND_BE, BATTLEGROUND_DS, BATTLEGROUND_EY, BATTLEGROUND_IC, BATTLEGROUND_NA, BATTLEGROUND_RL, BATTLEGROUND_RV, BATTLEGROUND_SA, BATTLEGROUND_WS, bgZoneIdToFillWorldStates, Battleground::FillInitialWorldStates(), InstanceScript::FillInitialWorldStates(), OutdoorPvP::FillInitialWorldStates(), Battlefield::FillInitialWorldStates(), GetBattleground(), Battleground::GetBgTypeID(), ObjectAccessor::GetCreature(), WorldObject::GetInstanceScript(), WorldLocation::GetMapId(), Battlefield::GetTypeId(), OutdoorPvP::GetTypeId(), LOG_DEBUG, MAP_HALLS_OF_REFLECTION, MAP_ICECROWN_CITADEL, MAP_OUTLAND, MAP_THE_CULLING_OF_STRATHOLME, MAP_THE_OCULUS, MAP_ULDUAR, WorldPackets::WorldState::InitWorldStates::MapID, OUTDOOR_PVP_EP, OUTDOOR_PVP_HP, OUTDOOR_PVP_NA, OUTDOOR_PVP_SI, OUTDOOR_PVP_TF, OUTDOOR_PVP_ZM, sArenaSeasonMgr, sBattlefieldMgr, SendBattlefieldWorldStates(), SendBGWeekendWorldStates(), SendDirectMessage(), sOutdoorPvPMgr, sWorldState, WORLD_STATE_AHNQIRAJ_SANDWORM_E, WORLD_STATE_AHNQIRAJ_SANDWORM_N, WORLD_STATE_AHNQIRAJ_SANDWORM_S, WORLD_STATE_AHNQIRAJ_SANDWORM_SW, WORLD_STATE_ARENA_SEASON_ID, WORLD_STATE_ARENA_SEASON_PROGRESS, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_ENABLE, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_COUNTDOWN_TIME, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_DEFENDERS_COUNT, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_EVENT_BEGIN_ENABLE, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SCOURGE_COUNT, WORLD_STATE_BATTLE_FOR_LIGHTS_HOPE_SOLDIERS_ENABLE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_ICON, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_BLACKSMITH_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_FARM_ICON, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_FARM_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_ICON, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_GOLDMINE_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_ICON, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_LUMBERMILL_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_OCCUPIED_BASES_HORDE, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_HORDE, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_MAX, WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING, WORLD_STATE_BATTLEGROUND_AB_STABLE_ICON, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_ALLIANCE, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_CONTROLLED_HORDE, WORLD_STATE_BATTLEGROUND_AB_STABLE_STATE_HORDE, WORLD_STATE_BATTLEGROUND_AB_UNK, WORLD_STATE_BATTLEGROUND_AV_AID_A_A, WORLD_STATE_BATTLEGROUND_AV_AID_A_C, WORLD_STATE_BATTLEGROUND_AV_AID_H_A, WORLD_STATE_BATTLEGROUND_AV_AID_H_C, WORLD_STATE_BATTLEGROUND_AV_DUNN_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_DUNN_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_DUNN_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_DUNN_UNUSED, WORLD_STATE_BATTLEGROUND_AV_DUNS_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_DUNS_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_DUNS_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_DUNS_UNUSED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_A_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLF_H_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFE_UNUSED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_A_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_A, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFHUT_H_C, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_FROSTWOLFW_UNUSED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_A, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_A_C, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_A, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_H_C, WORLD_STATE_BATTLEGROUND_AV_ICEBLOOD_UNUSED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_ICEWING_UNUSED, WORLD_STATE_BATTLEGROUND_AV_N_MINE_A, WORLD_STATE_BATTLEGROUND_AV_N_MINE_H, WORLD_STATE_BATTLEGROUND_AV_N_MINE_N, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_A, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_A_C, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_A, WORLD_STATE_BATTLEGROUND_AV_PIKEGRAVE_H_C, WORLD_STATE_BATTLEGROUND_AV_S_MINE_A, WORLD_STATE_BATTLEGROUND_AV_S_MINE_H, WORLD_STATE_BATTLEGROUND_AV_S_MINE_N, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_A, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_A_C, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_A, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_H_C, WORLD_STATE_BATTLEGROUND_AV_SNOWFALL_N, WORLD_STATE_BATTLEGROUND_AV_STONEH_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_STONEH_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_STONEH_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_STONEH_UNUSED, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_A, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_A_C, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_A, WORLD_STATE_BATTLEGROUND_AV_STONEHEART_H_C, WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_COMMANDERS, WORLD_STATE_BATTLEGROUND_AV_STORMPIKE_LIEUTENANTS, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_ASSAULTED, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_CONTROLLED, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_DESTROYED, WORLD_STATE_BATTLEGROUND_AV_TOWERPOINT_UNUSED, WORLD_STATE_BATTLEGROUND_AV_UNK_0, WORLD_STATE_BATTLEGROUND_AV_UNK_1, WORLD_STATE_BATTLEGROUND_AV_UNK_2, WORLD_STATE_BATTLEGROUND_AV_UNK_3, WORLD_STATE_BATTLEGROUND_AV_UNK_4, WORLD_STATE_BATTLEGROUND_AV_UNK_5, WORLD_STATE_BATTLEGROUND_BE_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_BE_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_BE_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_DS_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_DS_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_DS_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_BASE, WORLD_STATE_BATTLEGROUND_EY_ALLIANCE_RESOURCES, WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_BLOOD_ELF_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_DRAENEI_RUINS_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_FEL_REAVER_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_FLAG, WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_EY_FLAG_STATE_HORDE, WORLD_STATE_BATTLEGROUND_EY_HORDE_BASE, WORLD_STATE_BATTLEGROUND_EY_HORDE_RESOURCES, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_ALLIANCE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONFLICT, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_HORDE_CONTROL, WORLD_STATE_BATTLEGROUND_EY_MAGE_TOWER_UNCONTROL, WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_PERCENT_GREY, WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_SHOW, WORLD_STATE_BATTLEGROUND_EY_PROGRESS_BAR_STATUS, WORLD_STATE_BATTLEGROUND_EY_UNK_0, WORLD_STATE_BATTLEGROUND_EY_UNK_1, WORLD_STATE_BATTLEGROUND_EY_UNK_2, WORLD_STATE_BATTLEGROUND_EY_UNK_3, WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT, WORLD_STATE_BATTLEGROUND_IC_ALLIANCE_REINFORCEMENT_SET, WORLD_STATE_BATTLEGROUND_IC_DOCKS_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_A_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_EAST_H_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_A_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_CLOSED, WORLD_STATE_BATTLEGROUND_IC_GATE_FRONT_H_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_A_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_GATE_WEST_H_WS_OPEN, WORLD_STATE_BATTLEGROUND_IC_HANGAR_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_HORDE_KEEP_CONTROLLED_H, WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT, WORLD_STATE_BATTLEGROUND_IC_HORDE_REINFORCEMENT_SET, WORLD_STATE_BATTLEGROUND_IC_QUARRY_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_REFINERY_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_IC_UNK, WORLD_STATE_BATTLEGROUND_IC_WORKSHOP_UNCONTROLLED, WORLD_STATE_BATTLEGROUND_NA_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_NA_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_NA_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_RL_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_RL_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_RL_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_RV_ARENA_GOLD, WORLD_STATE_BATTLEGROUND_RV_ARENA_GREEN, WORLD_STATE_BATTLEGROUND_RV_ARENA_SHOW, WORLD_STATE_BATTLEGROUND_SA_ALLIANCE_DEFENSE_TOKEN, WORLD_STATE_BATTLEGROUND_SA_ANCIENT_GATE, WORLD_STATE_BATTLEGROUND_SA_BLUE_GATE, WORLD_STATE_BATTLEGROUND_SA_BONUS_TIMER, WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_CENTER_GY_HORDE, WORLD_STATE_BATTLEGROUND_SA_ENABLE_TIMER, WORLD_STATE_BATTLEGROUND_SA_GREEN_GATE, WORLD_STATE_BATTLEGROUND_SA_HORDE_ATTACKER, WORLD_STATE_BATTLEGROUND_SA_HORDE_DEFENSE_TOKEN, WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_LEFT_ATTACK_TOKEN_HORDE, WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_LEFT_GY_HORDE, WORLD_STATE_BATTLEGROUND_SA_PURPLE_GATE, WORLD_STATE_BATTLEGROUND_SA_RED_GATE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_ATTACK_TOKEN_HORDE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_ALLIANCE, WORLD_STATE_BATTLEGROUND_SA_RIGHT_GY_HORDE, WORLD_STATE_BATTLEGROUND_SA_TIMER_MINUTES, WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_FIRST_DIGIT, WORLD_STATE_BATTLEGROUND_SA_TIMER_SECONDS_SECOND_DIGIT, WORLD_STATE_BATTLEGROUND_SA_YELLOW_GATE, WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_ALLIANCE, WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_HORDE, WORLD_STATE_BATTLEGROUND_WS_FLAG_CAPTURES_MAX, WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_ALLIANCE, WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_HORDE, WORLD_STATE_BATTLEGROUND_WS_UNK_0, WORLD_STATE_BATTLEGROUND_WS_UNK_1, WORLD_STATE_BATTLEGROUND_WS_UNK_2, WORLD_STATE_CULLING_OF_STRATHOLME_CRATES_REVEALED, WORLD_STATE_CULLING_OF_STRATHOLME_SHOW_CRATES, WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN, WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN_SHOW, WORLD_STATE_CULLING_OF_STRATHOLME_WAVE_COUNT, WORLD_STATE_HALLS_OF_REFLECTION_WAVE_COUNT, WORLD_STATE_HALLS_OF_REFLECTION_WAVES_ENABLED, WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_MAX, WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_REMAINING, WORLD_STATE_ICECROWN_CITADEL_EXECUTION_TIME, WORLD_STATE_ICECROWN_CITADEL_SHOW_ATTEMPTS, WORLD_STATE_ICECROWN_CITADEL_SHOW_TIMER, WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_AMOUNT, WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_SHOW, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_A, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_H, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_A, WORLD_STATE_OPVP_EP_CROWNGUARDTOWER_N_H, WORLD_STATE_OPVP_EP_EASTWALLTOWER_A, WORLD_STATE_OPVP_EP_EASTWALLTOWER_H, WORLD_STATE_OPVP_EP_EASTWALLTOWER_N, WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_A, WORLD_STATE_OPVP_EP_EASTWALLTOWER_N_H, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_A, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_H, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_A, WORLD_STATE_OPVP_EP_NORTHPASSTOWER_N_H, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_A, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N, WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_N_A, WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_A, WORLD_STATE_OPVP_EP_UI_TOWER_COUNT_H, WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_N, WORLD_STATE_OPVP_EP_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_EP_UNK_0, WORLD_STATE_OPVP_EP_UNK_1, WORLD_STATE_OPVP_EP_UNK_2, WORLD_STATE_OPVP_EP_UNK_3, WORLD_STATE_OPVP_EP_UNK_5, WORLD_STATE_OPVP_EP_UNK_6, WORLD_STATE_OPVP_EP_UNK_7, WORLD_STATE_OPVP_EP_UNK_8, WORLD_STATE_OPVP_HP_BROKENHILL_A, WORLD_STATE_OPVP_HP_BROKENHILL_H, WORLD_STATE_OPVP_HP_BROKENHILL_N, WORLD_STATE_OPVP_HP_OVERLOOK_A, WORLD_STATE_OPVP_HP_OVERLOOK_H, WORLD_STATE_OPVP_HP_OVERLOOK_N, WORLD_STATE_OPVP_HP_STADIUM_A, WORLD_STATE_OPVP_HP_STADIUM_H, WORLD_STATE_OPVP_HP_STADIUM_N, WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_A, WORLD_STATE_OPVP_HP_UI_TOWER_COUNT_H, WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_A, WORLD_STATE_OPVP_HP_UI_TOWER_DISPLAY_H, WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_N, WORLD_STATE_OPVP_HP_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_NA_MAP_HALAA_ALLIANCE, WORLD_STATE_OPVP_NA_MAP_HALAA_HORDE, WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_A, WORLD_STATE_OPVP_NA_MAP_HALAA_NEU_H, WORLD_STATE_OPVP_NA_MAP_HALAA_NEUTRAL, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_EAST_NEU_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_NORTH_NEU_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_SOUTH_NEU_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_H, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_A, WORLD_STATE_OPVP_NA_MAP_WYVERN_WEST_NEU_H, WORLD_STATE_OPVP_NA_UI_ALLIANCE_GUARDS_SHOW, WORLD_STATE_OPVP_NA_UI_GUARDS_LEFT, WORLD_STATE_OPVP_NA_UI_GUARDS_MAX, WORLD_STATE_OPVP_NA_UI_HORDE_GUARDS_SHOW, WORLD_STATE_OPVP_NA_UI_SLIDER_N, WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_SI_GATHERED_A, WORLD_STATE_OPVP_SI_GATHERED_H, WORLD_STATE_OPVP_SI_SILITHYST_MAX, WORLD_STATE_OPVP_TF_TOWER_NUM_00, WORLD_STATE_OPVP_TF_TOWER_NUM_01, WORLD_STATE_OPVP_TF_TOWER_NUM_02, WORLD_STATE_OPVP_TF_TOWER_NUM_03, WORLD_STATE_OPVP_TF_TOWER_NUM_04, WORLD_STATE_OPVP_TF_TOWER_NUM_05, WORLD_STATE_OPVP_TF_TOWER_NUM_06, WORLD_STATE_OPVP_TF_TOWER_NUM_07, WORLD_STATE_OPVP_TF_TOWER_NUM_08, WORLD_STATE_OPVP_TF_TOWER_NUM_09, WORLD_STATE_OPVP_TF_TOWER_NUM_10, WORLD_STATE_OPVP_TF_TOWER_NUM_11, WORLD_STATE_OPVP_TF_TOWER_NUM_12, WORLD_STATE_OPVP_TF_TOWER_NUM_13, WORLD_STATE_OPVP_TF_TOWER_NUM_14, WORLD_STATE_OPVP_TF_TOWER_NUM_15, WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_ALLIANCE, WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_HORDE, WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_NEUTRAL, WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_HOURS, WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_FIRST_DIGIT, WORLD_STATE_OPVP_TF_UI_LOCKED_TIME_MINUTES_SECOND_DIGIT, WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_A, WORLD_STATE_OPVP_TF_UI_TOWER_COUNT_H, WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_DISPLAY, WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_N, WORLD_STATE_OPVP_TF_UI_TOWER_SLIDER_POS, WORLD_STATE_OPVP_TF_UI_TOWERS_CONTROLLED_DISPLAY, WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_NOT_READY, WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_READY, WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_A, WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_H, WORLD_STATE_OPVP_ZM_MAP_GRAVEYARD_N, WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_NOT_READY, WORLD_STATE_OPVP_ZM_MAP_HORDE_FLAG_READY, WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_A, WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_H, WORLD_STATE_OPVP_ZM_MAP_TOWER_EAST_N, WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_A, WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_H, WORLD_STATE_OPVP_ZM_MAP_TOWER_WEST_N, WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_A, WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_H, WORLD_STATE_OPVP_ZM_UI_TOWER_EAST_N, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_E, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_DISPLAY_W, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_E, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_N_W, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_E, WORLD_STATE_OPVP_ZM_UI_TOWER_SLIDER_POS_W, WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_A, WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_H, WORLD_STATE_OPVP_ZM_UI_TOWER_WEST_N, WORLD_STATE_OPVP_ZM_UNK, WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_MATERIAL, WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TOGGLE, WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TWILIGHT, WORLD_STATE_SCOURGE_INVASION_AZSHARA, WORLD_STATE_SCOURGE_INVASION_BLASTED_LANDS, WORLD_STATE_SCOURGE_INVASION_BURNING_STEPPES, WORLD_STATE_SCOURGE_INVASION_EASTERN_PLAGUELANDS, WORLD_STATE_SCOURGE_INVASION_TANARIS, WORLD_STATE_SCOURGE_INVASION_WINTERSPRING, WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER, WORLD_STATE_ULDUAR_ALGALON_TIMER_ENABLED, WORLD_STATE_VIOLET_HOLD_PRISON_STATE, WORLD_STATE_VIOLET_HOLD_SHOW, WORLD_STATE_VIOLET_HOLD_WAVE_COUNT, WorldPackets::WorldState::InitWorldStates::Worldstates, WorldPackets::WorldState::InitWorldStates::Write(), and WorldPackets::WorldState::InitWorldStates::ZoneID.

Referenced by ArenaSeasonMgr::BroadcastUpdatedWorldState(), WorldSession::HandlePlayerLoginToCharInWorld(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), and UpdateZone().

◆ SendInstanceResetWarning()

void Player::SendInstanceResetWarning ( uint32  mapid,
Difficulty  difficulty,
uint32  time,
bool  onEnterMap 
)
11787{
11788 // pussywizard:
11789 InstancePlayerBind* bind = sInstanceSaveMgr->PlayerGetBoundInstance(GetGUID(), mapid, difficulty);
11790 if (bind && bind->extended)
11791 {
11792 if (!onEnterMap) // extended id player shouldn't be warned about lock expiration
11793 return;
11794 time += (bind->save->GetExtendedResetTime() - bind->save->GetResetTime()); // add lockout period to the time left
11795 }
11796
11797 // type of warning, based on the time remaining until reset
11798 uint32 type;
11799 if (time > 3600)
11800 type = RAID_INSTANCE_WELCOME;
11801 else if (time > 900)
11803 else if (time > 300)
11805 else
11807
11808 WorldPacket data(SMSG_RAID_INSTANCE_MESSAGE, 4 + 4 + 4 + 4);
11809 data << uint32(type);
11810 data << uint32(mapid);
11811 data << uint32(difficulty); // difficulty
11812 data << uint32(time);
11813 if (type == RAID_INSTANCE_WELCOME)
11814 {
11815 data << uint8(bind && bind->perm); // is locked
11816 data << uint8(bind && bind->extended); // is extended, ignored if prev field is 0
11817 }
11818 SendDirectMessage(&data);
11819}
@ RAID_INSTANCE_WARNING_MIN
Definition Player.h:799
@ RAID_INSTANCE_WARNING_MIN_SOON
Definition Player.h:800
@ RAID_INSTANCE_WARNING_HOURS
Definition Player.h:798
@ RAID_INSTANCE_WELCOME
Definition Player.h:801
time_t GetExtendedResetTime() const
Definition InstanceSaveMgr.h:76
time_t GetResetTime() const
Definition InstanceSaveMgr.h:75
@ SMSG_RAID_INSTANCE_MESSAGE
Definition Opcodes.h:792
Definition InstanceSaveMgr.h:39
InstanceSave * save
Definition InstanceSaveMgr.h:40
bool extended
Definition InstanceSaveMgr.h:42
bool perm
Definition InstanceSaveMgr.h:41

References InstancePlayerBind::extended, InstanceSave::GetExtendedResetTime(), Object::GetGUID(), InstanceSave::GetResetTime(), InstancePlayerBind::perm, RAID_INSTANCE_WARNING_HOURS, RAID_INSTANCE_WARNING_MIN, RAID_INSTANCE_WARNING_MIN_SOON, RAID_INSTANCE_WELCOME, InstancePlayerBind::save, SendDirectMessage(), sInstanceSaveMgr, and SMSG_RAID_INSTANCE_MESSAGE.

Referenced by WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), and WorldSession::HandlePlayerLoginToCharInWorld().

◆ SendItemDurations()

void Player::SendItemDurations ( )
4749{
4750 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end(); ++itr)
4751 {
4752 (*itr)->SendTimeUpdate(this);
4753 }
4754}

References m_itemDuration.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendItemRetrievalMail() [1/2]

void Player::SendItemRetrievalMail ( std::vector< std::pair< uint32, uint32 > >  mailItems)
445{
446 if (mailItems.empty())
447 {
448 // Skip send if empty items
449 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Attempt to send almost with items without items. Player {}", GetGUID().ToString());
450 return;
451 }
452
453 using SendMailTempateVector = std::vector<std::pair<uint32, uint32>>;
454
455 std::vector<SendMailTempateVector> allItems;
456
457 auto AddMailItem = [&allItems](uint32 itemEntry, uint32 itemCount)
458 {
459 SendMailTempateVector toSendItems;
460
461 ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(itemEntry);
462 if (!itemTemplate)
463 {
464 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Item id {} is invalid", itemEntry);
465 return;
466 }
467
468 if (itemCount < 1 || (itemTemplate->MaxCount > 0 && itemCount > static_cast<uint32>(itemTemplate->MaxCount)))
469 {
470 LOG_ERROR("entities.player.items", "> SendItemRetrievalMail: Incorrect item count ({}) for item id {}", itemEntry, itemCount);
471 return;
472 }
473
474 while (itemCount > itemTemplate->GetMaxStackSize())
475 {
476 if (toSendItems.size() <= MAX_MAIL_ITEMS)
477 {
478 toSendItems.emplace_back(itemEntry, itemTemplate->GetMaxStackSize());
479 itemCount -= itemTemplate->GetMaxStackSize();
480 }
481 else
482 {
483 allItems.emplace_back(toSendItems);
484 toSendItems.clear();
485 }
486 }
487
488 toSendItems.emplace_back(itemEntry, itemCount);
489 allItems.emplace_back(toSendItems);
490 };
491
492 for (auto& [itemEntry, itemCount] : mailItems)
493 {
494 AddMailItem(itemEntry, itemCount);
495 }
496
497 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
498
499 for (auto const& items : allItems)
500 {
501 MailSender sender(MAIL_CREATURE, 34337 /* The Postmaster */);
502 MailDraft draft("Recovered Item", "We recovered a lost item in the twisting nether and noted that it was yours.$B$BPlease find said object enclosed."); // This is the text used in Cataclysm, it probably wasn't changed.
503
504 for (auto const& [itemEntry, itemCount] : items)
505 {
506 if (Item* mailItem = Item::CreateItem(itemEntry, itemCount))
507 {
508 mailItem->SaveToDB(trans);
509 draft.AddItem(mailItem);
510 }
511 }
512
513 draft.SendMailTo(trans, MailReceiver(this, GetGUID().GetCounter()), sender);
514 }
515
516 CharacterDatabase.CommitTransaction(trans);
517}

References MailDraft::AddItem(), CharacterDatabase, Item::CreateItem(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), LOG_ERROR, MAIL_CREATURE, MAX_MAIL_ITEMS, ItemTemplate::MaxCount, MailDraft::SendMailTo(), sObjectMgr, and Position::ToString().

◆ SendItemRetrievalMail() [2/2]

void Player::SendItemRetrievalMail ( uint32  itemEntry,
uint32  count 
)

◆ SendLearnPacket()

void Player::SendLearnPacket ( uint32  spellId,
bool  learn 
)
3033{
3034 if (learn)
3035 {
3037 data << uint32(spellId);
3038 data << uint16(0);
3039 SendDirectMessage(&data);
3040 }
3041 else
3042 {
3044 data << uint32(spellId);
3045 SendDirectMessage(&data);
3046 }
3047}
@ SMSG_REMOVED_SPELL
Definition Opcodes.h:545
@ SMSG_LEARNED_SPELL
Definition Opcodes.h:329

References SendDirectMessage(), SMSG_LEARNED_SPELL, and SMSG_REMOVED_SPELL.

Referenced by _addSpell(), ActivateSpec(), addTalent(), Spell::EffectApplyGlyph(), WorldSession::HandleRemoveGlyph(), learnSpell(), LearnTalent(), removeSpell(), and resetTalents().

◆ SendLogXPGain()

void Player::SendLogXPGain ( uint32  GivenXP,
Unit victim,
uint32  BonusXP,
bool  recruitAFriend = false,
float  group_rate = 1.0f 
)
2352{
2353 WorldPacket data(SMSG_LOG_XPGAIN, 22); // guess size?
2354 data << (victim ? victim->GetGUID() : ObjectGuid::Empty); // guid
2355 data << uint32(GivenXP + BonusXP); // given experience
2356 data << uint8(victim ? 0 : 1); // 00-kill_xp type, 01-non_kill_xp type
2357
2358 if (victim)
2359 {
2360 data << uint32(GivenXP); // experience without bonus
2361
2362 // should use group_rate here but can't figure out how
2363 data << float(1); // 1 - none 0 - 100% group bonus output
2364 }
2365
2366 data << uint8(recruitAFriend ? 1 : 0); // does the GivenXP include a RaF bonus?
2367 SendDirectMessage(&data);
2368}
@ SMSG_LOG_XPGAIN
Definition Opcodes.h:494

References ObjectGuid::Empty, Object::GetGUID(), SendDirectMessage(), and SMSG_LOG_XPGAIN.

Referenced by GiveXP().

◆ SendLoot()

void Player::SendLoot ( ObjectGuid  guid,
LootType  loot_type 
)
7832{
7833 if (ObjectGuid lguid = GetLootGUID())
7834 m_session->DoLootRelease(lguid);
7835
7836 Loot* loot = 0;
7837 PermissionTypes permission = ALL_PERMISSION;
7838
7839 LOG_DEBUG("loot", "Player::SendLoot");
7840
7841 // remove FD and invisibility at all loots
7842 constexpr std::array<AuraType, 2> toRemove = {SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_FEIGN_DEATH};
7843 for (auto const& aura : toRemove)
7844 {
7845 RemoveAurasByType(aura);
7846 }
7847 // remove stealth only if looting a corpse
7848 if (loot_type == LOOT_CORPSE && !guid.IsItem())
7849 {
7851 }
7852
7853 if (guid.IsGameObject())
7854 {
7855 LOG_DEBUG("loot", "guid.IsGameObject");
7856 GameObject* go = GetMap()->GetGameObject(guid);
7857
7858 // not check distance for GO in case owned GO (fishing bobber case, for example)
7859 // And permit out of range GO with no owner in case fishing hole
7860 if (!go || (loot_type != LOOT_FISHINGHOLE && ((loot_type != LOOT_FISHING && loot_type != LOOT_FISHING_JUNK) || go->GetOwnerGUID() != GetGUID()) && !go->IsWithinDistInMap(this)) || (loot_type == LOOT_CORPSE && go->GetRespawnTime() && go->isSpawnedByDefault()))
7861 {
7863 SendLootRelease(guid);
7864 return;
7865 }
7866
7867 loot = &go->loot;
7868
7869 // Xinef: loot was generated and respawntime has passed since then, allow to recreate loot
7870 // Xinef: to avoid bugs, this rule covers spawned gameobjects only
7871 if (go->isSpawnedByDefault() && go->getLootState() == GO_ACTIVATED && !go->loot.isLooted() && go->GetLootGenerationTime() + go->GetRespawnDelay() < GameTime::GetGameTime().count())
7873
7874 if (go->getLootState() == GO_READY)
7875 {
7876 uint32 lootid = go->GetGOInfo()->GetLootId();
7877
7878 //TODO: fix this big hack
7880 if (Battleground* bg = GetBattleground())
7881 if (bg->GetBgTypeID(true) == BATTLEGROUND_AV)
7882 if (!bg->ToBattlegroundAV()->PlayerCanDoMineQuest(go->GetEntry(), GetTeamId()))
7883 {
7885 SendLootRelease(guid);
7886 return;
7887 }
7888
7889 if (lootid)
7890 {
7891 loot->clear();
7892
7893 Group* group = GetGroup();
7894 bool groupRules = (group && go->GetGOInfo()->type == GAMEOBJECT_TYPE_CHEST && go->GetGOInfo()->chest.groupLootRules);
7895
7896 // check current RR player and get next if necessary
7897 if (groupRules)
7898 group->UpdateLooterGuid(go, true);
7899
7900 loot->FillLoot(lootid, LootTemplates_Gameobject, this, !groupRules, false, go->GetLootMode(), go);
7902
7903 // get next RR player (for next loot)
7904 if (groupRules && !go->loot.empty())
7905 group->UpdateLooterGuid(go);
7906 }
7907 if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
7908 loot->generateMoneyLoot(addon->mingold, addon->maxgold);
7909
7910 if (loot_type == LOOT_FISHING)
7911 go->GetFishLoot(loot, this);
7912 else if (loot_type == LOOT_FISHING_JUNK)
7913 go->GetFishLoot(loot, this, true);
7914
7916 {
7917 if (Group* group = GetGroup())
7918 {
7919 switch (group->GetLootMethod())
7920 {
7921 case GROUP_LOOT:
7922 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
7923 group->GroupLoot(loot, go);
7924 break;
7925 case NEED_BEFORE_GREED:
7926 group->NeedBeforeGreed(loot, go);
7927 break;
7928 case MASTER_LOOT:
7929 group->MasterLoot(loot, go);
7930 break;
7931 default:
7932 break;
7933 }
7934 }
7935 }
7936
7937 go->SetLootState(GO_ACTIVATED, this);
7938 }
7939
7940 if (go->getLootState() == GO_ACTIVATED)
7941 {
7942 if (Group* group = GetGroup())
7943 {
7944 switch (group->GetLootMethod())
7945 {
7946 case MASTER_LOOT:
7948 break;
7949 case FREE_FOR_ALL:
7950 permission = ALL_PERMISSION;
7951 break;
7952 case ROUND_ROBIN:
7953 permission = ROUND_ROBIN_PERMISSION;
7954 break;
7955 default:
7956 permission = GROUP_PERMISSION;
7957 break;
7958 }
7959 }
7960 else
7961 permission = ALL_PERMISSION;
7962 }
7963 }
7964 else if (guid.IsItem())
7965 {
7966 Item* item = GetItemByGuid(guid);
7967
7968 if (!item)
7969 {
7970 SendLootRelease(guid);
7971 return;
7972 }
7973
7974 permission = OWNER_PERMISSION;
7975
7976 loot = &item->loot;
7977
7978 // Xinef: Store container id
7979 loot->containerGUID = item->GetGUID();
7980
7981 if (!item->m_lootGenerated && !sLootItemStorage->LoadStoredLoot(item, this))
7982 {
7983 item->m_lootGenerated = true;
7984 loot->clear();
7985
7986 switch (loot_type)
7987 {
7988 case LOOT_DISENCHANTING:
7989 loot->FillLoot(item->GetTemplate()->DisenchantID, LootTemplates_Disenchant, this, true);
7990 break;
7991 case LOOT_PROSPECTING:
7992 loot->FillLoot(item->GetEntry(), LootTemplates_Prospecting, this, true);
7993 break;
7994 case LOOT_MILLING:
7995 loot->FillLoot(item->GetEntry(), LootTemplates_Milling, this, true);
7996 break;
7997 default:
7999 loot->FillLoot(item->GetEntry(), LootTemplates_Item, this, true, loot->gold != 0);
8000
8001 // Xinef: Add to storage
8002 if (loot->gold > 0 || loot->unlootedCount > 0)
8003 sLootItemStorage->AddNewStoredLoot(loot, this);
8004
8005 break;
8006 }
8007 }
8008 }
8009 else if (guid.IsCorpse()) // remove insignia
8010 {
8011 Corpse* bones = ObjectAccessor::GetCorpse(*this, guid);
8012
8013 if (!bones || !(loot_type == LOOT_CORPSE || loot_type == LOOT_INSIGNIA) || bones->GetType() != CORPSE_BONES || !bones->HasFlag(CORPSE_FIELD_DYNAMIC_FLAGS, CORPSE_DYNFLAG_LOOTABLE))
8014 {
8015 SendLootRelease(guid);
8016 return;
8017 }
8018
8019 loot = &bones->loot;
8020
8021 if (loot->loot_type == LOOT_NONE)
8022 {
8023 uint32 pLevel = bones->loot.gold;
8024 bones->loot.clear();
8025
8026 loot->FillLoot(GetTeamId(), LootTemplates_Player, this, true);
8027
8028 // It may need a better formula
8029 // Now it works like this: lvl10: ~6copper, lvl70: ~9silver
8030 bones->loot.gold = uint32(urand(50, 150) * 0.016f * pow(float(pLevel) / 5.76f, 2.5f) * sWorld->getRate(RATE_DROP_MONEY));
8031 }
8032
8033 if (bones->lootRecipient != this)
8034 permission = NONE_PERMISSION;
8035 else
8036 permission = OWNER_PERMISSION;
8037 }
8038 else
8039 {
8040 Creature* creature = GetMap()->GetCreature(guid);
8041
8042 // must be in range and creature must be alive for pickpocket and must be dead for another loot
8043 if (!creature || creature->IsAlive() != (loot_type == LOOT_PICKPOCKETING) || !creature->IsWithinDistInMap(this, INTERACTION_DISTANCE))
8044 {
8045 SendLootRelease(guid);
8046 return;
8047 }
8048
8049 if (loot_type == LOOT_PICKPOCKETING && IsFriendlyTo(creature))
8050 {
8051 SendLootRelease(guid);
8052 return;
8053 }
8054
8055 loot = &creature->loot;
8056
8057 if (loot_type == LOOT_PICKPOCKETING)
8058 {
8059 if (!loot || loot->loot_type != LOOT_PICKPOCKETING)
8060 {
8061 if (creature->CanGeneratePickPocketLoot())
8062 {
8063 creature->SetPickPocketLootTime();
8064 loot->clear();
8065
8066 if (uint32 lootid = creature->GetCreatureTemplate()->pickpocketLootId)
8067 loot->FillLoot(lootid, LootTemplates_Pickpocketing, this, true);
8068
8069 // Generate extra money for pick pocket loot
8070 const uint32 a = urand(0, creature->GetLevel() / 2);
8071 const uint32 b = urand(0, GetLevel() / 2);
8072 loot->gold = uint32(10 * (a + b) * sWorld->getRate(RATE_DROP_MONEY));
8073 permission = OWNER_PERMISSION;
8074 }
8075 else
8076 {
8077 permission = NONE_PERMISSION;
8079 return;
8080 }
8081 }
8082 }
8083 else
8084 {
8085 // Xinef: Exploit fix
8086 if (!creature->HasDynamicFlag(UNIT_DYNFLAG_LOOTABLE))
8087 {
8089 return;
8090 }
8091
8092 // the player whose group may loot the corpse
8093 Player* recipient = creature->GetLootRecipient();
8094 Group* recipientGroup = creature->GetLootRecipientGroup();
8095 if (!recipient && !recipientGroup)
8096 return;
8097
8098 if (loot->loot_type == LOOT_NONE)
8099 {
8100 // for creature, loot is filled when creature is killed.
8101 if (recipientGroup)
8102 {
8103 switch (recipientGroup->GetLootMethod())
8104 {
8105 case GROUP_LOOT:
8106 // GroupLoot: rolls items over threshold. Items with quality < threshold, round robin
8107 recipientGroup->GroupLoot(loot, creature);
8108 break;
8109 case NEED_BEFORE_GREED:
8110 recipientGroup->NeedBeforeGreed(loot, creature);
8111 break;
8112 case MASTER_LOOT:
8113 recipientGroup->MasterLoot(loot, creature);
8114 break;
8115 default:
8116 break;
8117 }
8118 }
8119 }
8120
8121 // if loot is already skinning loot then don't do anything else
8122 if (loot->loot_type == LOOT_SKINNING)
8123 {
8124 loot_type = LOOT_SKINNING;
8125 permission = creature->GetLootRecipientGUID() == GetGUID() ? OWNER_PERMISSION : NONE_PERMISSION;
8126 }
8127 else if (loot_type == LOOT_SKINNING)
8128 {
8129 loot->clear();
8130 loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, this, true);
8131 permission = OWNER_PERMISSION;
8132
8133 //Inform instance if creature is skinned.
8134 if (InstanceScript* mapInstance = creature->GetInstanceScript())
8135 {
8136 mapInstance->CreatureLooted(creature, LOOT_SKINNING);
8137 }
8138
8139 // Xinef: Set new loot recipient
8140 creature->SetLootRecipient(this, false);
8141 }
8142 // set group rights only for loot_type != LOOT_SKINNING
8143 else
8144 {
8145 if (recipientGroup)
8146 {
8147 if (GetGroup() == recipientGroup)
8148 {
8149 switch (recipientGroup->GetLootMethod())
8150 {
8151 case MASTER_LOOT:
8152 permission = recipientGroup->GetMasterLooterGuid() == GetGUID() ? MASTER_PERMISSION : RESTRICTED_PERMISSION;
8153 break;
8154 case FREE_FOR_ALL:
8155 permission = ALL_PERMISSION;
8156 break;
8157 case ROUND_ROBIN:
8158 permission = ROUND_ROBIN_PERMISSION;
8159 break;
8160 default:
8161 permission = GROUP_PERMISSION;
8162 break;
8163 }
8164 }
8165 else
8166 permission = NONE_PERMISSION;
8167 }
8168 else if (recipient == this)
8169 permission = OWNER_PERMISSION;
8170 else
8171 permission = NONE_PERMISSION;
8172 }
8173 }
8174 }
8175
8176 // LOOT_INSIGNIA and LOOT_FISHINGHOLE unsupported by client
8177 switch (loot_type)
8178 {
8179 case LOOT_INSIGNIA:
8180 loot_type = LOOT_SKINNING;
8181 break;
8182 case LOOT_FISHINGHOLE:
8183 loot_type = LOOT_FISHING;
8184 break;
8185 case LOOT_FISHING_JUNK:
8186 loot_type = LOOT_FISHING;
8187 break;
8188 default:
8189 break;
8190 }
8191
8192 // need know merged fishing/corpse loot type for achievements
8193 loot->loot_type = loot_type;
8194
8195 if (!sScriptMgr->OnAllowedToLootContainerCheck(this, guid))
8196 {
8198 return;
8199 }
8200
8201 if (permission != NONE_PERMISSION)
8202 {
8203 SetLootGUID(guid);
8204
8205 WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
8206 data << guid;
8207 data << uint8(loot_type);
8208 data << LootView(*loot, this, permission);
8209
8210 SendDirectMessage(&data);
8211
8212 // add 'this' player as one of the players that are looting 'loot'
8213 loot->AddLooter(GetGUID());
8214
8215 if (loot_type == LOOT_CORPSE && !guid.IsItem())
8217 }
8218 else
8220}
@ BG_AV_OBJECTID_MINE_N
Definition BattlegroundAV.h:156
@ BG_AV_OBJECTID_MINE_S
Definition BattlegroundAV.h:157
@ CORPSE_BONES
Definition Corpse.h:28
@ GO_ACTIVATED
Definition GameObject.h:112
@ GO_READY
Definition GameObject.h:111
LootStore LootTemplates_Skinning("skinning_loot_template", "creature skinning id", true)
LootStore LootTemplates_Gameobject("gameobject_loot_template", "gameobject entry", true)
LootStore LootTemplates_Item("item_loot_template", "item entry", true)
LootStore LootTemplates_Milling("milling_loot_template", "item entry (herb)", true)
LootStore LootTemplates_Disenchant("disenchant_loot_template", "item disenchant id", true)
LootStore LootTemplates_Prospecting("prospecting_loot_template", "item entry (ore)", true)
LootStore LootTemplates_Pickpocketing("pickpocketing_loot_template", "creature pickpocket lootid", true)
LootStore LootTemplates_Player("player_loot_template", "team id", true)
PermissionTypes
Definition LootMgr.h:66
@ OWNER_PERMISSION
Definition LootMgr.h:72
@ ALL_PERMISSION
Definition LootMgr.h:67
@ RESTRICTED_PERMISSION
Definition LootMgr.h:70
@ NONE_PERMISSION
Definition LootMgr.h:73
@ ROUND_ROBIN_PERMISSION
Definition LootMgr.h:71
@ MASTER_PERMISSION
Definition LootMgr.h:69
@ GROUP_PERMISSION
Definition LootMgr.h:68
@ LOOT_ERROR_DIDNT_KILL
Definition LootMgr.h:96
@ LOOT_ERROR_ALREADY_PICKPOCKETED
Definition LootMgr.h:107
@ LOOT_PICKPOCKETING
Definition LootMgr.h:81
@ LOOT_MILLING
Definition LootMgr.h:87
@ LOOT_FISHING_JUNK
Definition LootMgr.h:91
@ LOOT_CORPSE
Definition LootMgr.h:80
@ LOOT_FISHING
Definition LootMgr.h:82
@ LOOT_DISENCHANTING
Definition LootMgr.h:83
@ LOOT_FISHINGHOLE
Definition LootMgr.h:89
@ LOOT_NONE
Definition LootMgr.h:78
@ LOOT_PROSPECTING
Definition LootMgr.h:86
@ GAMEOBJECT_TYPE_CHEST
Definition SharedDefines.h:1574
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3371
@ SPELL_AURA_MOD_INVISIBILITY
Definition SpellAuraDefines.h:81
@ SPELL_AURA_FEIGN_DEATH
Definition SpellAuraDefines.h:129
@ SPELL_AURA_MOD_STEALTH
Definition SpellAuraDefines.h:79
@ GAMEOBJECT_BYTES_1
Definition UpdateFields.h:404
@ RATE_DROP_MONEY
Definition WorldConfig.h:423
Loot loot
Definition Creature.h:229
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1333
ObjectGuid GetLootRecipientGUID() const
Definition Creature.h:230
void SetPickPocketLootTime()
Definition Creature.cpp:3669
Player * GetLootRecipient() const
Definition Creature.cpp:1319
bool CanGeneratePickPocketLoot() const
Definition Creature.cpp:3674
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1326
uint32 GetRespawnDelay() const
Definition GameObject.h:197
bool IsWithinDistInMap(Player const *player) const
Definition GameObject.cpp:2995
Loot loot
Definition GameObject.h:246
LootState getLootState() const
Definition GameObject.h:223
bool isSpawnedByDefault() const
Definition GameObject.h:195
void GetFishLoot(Loot *fishLoot, Player *lootOwner, bool junk=false)
Definition GameObject.cpp:1001
time_t GetRespawnTime() const
Definition GameObject.h:183
uint32 GetLootGenerationTime() const
Definition GameObject.h:257
void SetLootState(LootState s, Unit *unit=nullptr)
Definition GameObject.cpp:2434
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
GameObjectTemplateAddon const * GetTemplateAddon() const
Definition GameObject.cpp:911
void SetLootGenerationTime()
Definition GameObject.cpp:2924
uint16 GetLootMode() const
Definition GameObject.h:227
void NeedBeforeGreed(Loot *loot, WorldObject *pLootedObject)
Definition Group.cpp:1160
ObjectGuid GetMasterLooterGuid() const
Definition Group.cpp:2336
void GroupLoot(Loot *loot, WorldObject *pLootedObject)
Definition Group.cpp:1004
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1868
void MasterLoot(Loot *loot, WorldObject *pLootedObject)
Definition Group.cpp:1311
Loot loot
Definition Item.h:320
bool IsCorpse() const
Definition ObjectGuid.h:173
bool IsItem() const
Definition ObjectGuid.h:170
bool IsGameObject() const
Definition ObjectGuid.h:171
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2077
void SendLootRelease(ObjectGuid guid)
Definition Player.cpp:7824
void SetLootGUID(ObjectGuid guid)
Definition Player.h:1994
void SendLootError(ObjectGuid guid, LootError error)
Definition Player.cpp:8222
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10292
@ SMSG_LOOT_RESPONSE
Definition Opcodes.h:382
Corpse * GetCorpse(WorldObject const &u, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:179
uint32 SkinLootId
Definition CreatureData.h:226
uint32 pickpocketLootId
Definition CreatureData.h:225
Definition GameObjectData.h:666
uint32 type
Definition GameObjectData.h:33
struct GameObjectTemplate::@232::@237 chest
uint32 groupLootRules
Definition GameObjectData.h:98
uint32 GetLootId() const
Definition GameObjectData.h:539
uint32 DisenchantID
Definition ItemTemplate.h:690
uint32 MinMoneyLoot
Definition ItemTemplate.h:692
uint32 MaxMoneyLoot
Definition ItemTemplate.h:693
Definition LootMgr.h:405
void AddLooter(ObjectGuid GUID)
Definition LootMgr.h:373
ObjectGuid containerGUID
Definition LootMgr.h:329
bool empty() const
Definition LootMgr.h:367
void clear()
Definition LootMgr.h:343
uint8 unlootedCount
Definition LootMgr.h:323
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:838

References Loot::AddLooter(), ALL_PERMISSION, BATTLEGROUND_AV, BG_AV_OBJECTID_MINE_N, BG_AV_OBJECTID_MINE_S, Creature::CanGeneratePickPocketLoot(), GameObjectTemplate::chest, Loot::clear(), Loot::containerGUID, CORPSE_BONES, CORPSE_DYNFLAG_LOOTABLE, CORPSE_FIELD_DYNAMIC_FLAGS, ItemTemplate::DisenchantID, WorldSession::DoLootRelease(), Loot::empty(), Loot::FillLoot(), Object::ForceValuesUpdateAtIndex(), FREE_FOR_ALL, GAMEOBJECT_BYTES_1, GAMEOBJECT_TYPE_CHEST, Loot::generateMoneyLoot(), GetBattleground(), ObjectAccessor::GetCorpse(), Map::GetCreature(), Creature::GetCreatureTemplate(), Object::GetEntry(), GameObject::GetFishLoot(), Map::GetGameObject(), GameTime::GetGameTime(), GameObject::GetGOInfo(), GetGroup(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetInstanceScript(), GetItemByGuid(), Unit::GetLevel(), GameObject::GetLootGenerationTime(), GetLootGUID(), GameObjectTemplate::GetLootId(), Group::GetLootMethod(), GameObject::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), Creature::GetLootRecipientGUID(), GameObject::getLootState(), WorldObject::GetMap(), Group::GetMasterLooterGuid(), GameObject::GetOwnerGUID(), GameObject::GetRespawnDelay(), GameObject::GetRespawnTime(), GetTeamId(), Item::GetTemplate(), GameObject::GetTemplateAddon(), Corpse::GetType(), GO_ACTIVATED, GO_READY, Loot::gold, GROUP_LOOT, GROUP_PERMISSION, Group::GroupLoot(), GameObjectTemplate::groupLootRules, Object::HasDynamicFlag(), Object::HasFlag(), INTERACTION_DISTANCE, Unit::IsAlive(), ObjectGuid::IsCorpse(), Unit::IsFriendlyTo(), ObjectGuid::IsGameObject(), ObjectGuid::IsItem(), Loot::isLooted(), GameObject::isSpawnedByDefault(), GameObject::IsWithinDistInMap(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Corpse::loot, Creature::loot, GameObject::loot, Item::loot, LOOT_CORPSE, LOOT_DISENCHANTING, LOOT_ERROR_ALREADY_PICKPOCKETED, LOOT_ERROR_DIDNT_KILL, LOOT_FISHING, LOOT_FISHING_JUNK, LOOT_FISHINGHOLE, LOOT_INSIGNIA, LOOT_MILLING, LOOT_NONE, LOOT_PICKPOCKETING, LOOT_PROSPECTING, LOOT_SKINNING, Loot::loot_type, Corpse::lootRecipient, LootTemplates_Disenchant, LootTemplates_Gameobject, LootTemplates_Item, LootTemplates_Milling, LootTemplates_Pickpocketing, LootTemplates_Player, LootTemplates_Prospecting, LootTemplates_Skinning, Item::m_lootGenerated, m_session, MASTER_LOOT, MASTER_PERMISSION, Group::MasterLoot(), ItemTemplate::MaxMoneyLoot, ItemTemplate::MinMoneyLoot, NEED_BEFORE_GREED, Group::NeedBeforeGreed(), NONE_PERMISSION, OWNER_PERMISSION, CreatureTemplate::pickpocketLootId, RATE_DROP_MONEY, Unit::RemoveAurasByType(), RESTRICTED_PERMISSION, ROUND_ROBIN, ROUND_ROBIN_PERMISSION, SendDirectMessage(), SendLootError(), SendLootRelease(), GameObject::SetLootGenerationTime(), SetLootGUID(), Creature::SetLootRecipient(), GameObject::SetLootState(), Creature::SetPickPocketLootTime(), Unit::SetUnitFlag(), CreatureTemplate::SkinLootId, sLootItemStorage, SMSG_LOOT_RESPONSE, SPELL_AURA_FEIGN_DEATH, SPELL_AURA_MOD_INVISIBILITY, SPELL_AURA_MOD_STEALTH, sScriptMgr, sWorld, GameObjectTemplate::type, UNIT_DYNFLAG_LOOTABLE, UNIT_FLAG_LOOTING, Loot::unlootedCount, Group::UpdateLooterGuid(), and urand().

Referenced by Spell::EffectMilling(), Spell::EffectPickPocket(), Spell::EffectProspecting(), Spell::EffectSkinning(), WorldSession::HandleLootOpcode(), WorldSession::HandleOpenItemOpcode(), go_hive_pod::OnGossipHello(), RemovedInsignia(), Spell::SendLoot(), and GameObject::Use().

◆ SendLootError()

void Player::SendLootError ( ObjectGuid  guid,
LootError  error 
)

◆ SendLootRelease()

void Player::SendLootRelease ( ObjectGuid  guid)
7825{
7827 data << guid << uint8(1);
7828 SendDirectMessage(&data);
7829}
@ SMSG_LOOT_RELEASE_RESPONSE
Definition Opcodes.h:383

References SendDirectMessage(), and SMSG_LOOT_RELEASE_RESPONSE.

Referenced by WorldSession::DoLootRelease(), WorldSession::HandleAutostoreLootItemOpcode(), SendLoot(), and StoreLootItem().

◆ SendMailResult()

void Player::SendMailResult ( uint32  mailId,
MailResponseType  mailAction,
MailResponseResult  mailError,
uint32  equipError = 0,
ObjectGuid::LowType  item_guid = 0,
uint32  item_count = 0 
)
2861{
2862 WorldPacket data(SMSG_SEND_MAIL_RESULT, (4 + 4 + 4 + (mailError == MAIL_ERR_EQUIP_ERROR ? 4 : (mailAction == MAIL_ITEM_TAKEN ? 4 + 4 : 0))));
2863 data << (uint32) mailId;
2864 data << (uint32) mailAction;
2865 data << (uint32) mailError;
2866 if (mailError == MAIL_ERR_EQUIP_ERROR)
2867 data << (uint32) equipError;
2868 else if (mailAction == MAIL_ITEM_TAKEN)
2869 {
2870 data << (uint32) item_guid; // item guid low?
2871 data << (uint32) item_count; // item count?
2872 }
2873 SendDirectMessage(&data);
2874}
@ MAIL_ITEM_TAKEN
Definition SharedDefines.h:3768
@ MAIL_ERR_EQUIP_ERROR
Definition SharedDefines.h:3777
@ SMSG_SEND_MAIL_RESULT
Definition Opcodes.h:599

References MAIL_ERR_EQUIP_ERROR, MAIL_ITEM_TAKEN, SendDirectMessage(), and SMSG_SEND_MAIL_RESULT.

Referenced by WorldSession::HandleMailCreateTextItem(), WorldSession::HandleMailDelete(), WorldSession::HandleMailReturnToSender(), WorldSession::HandleMailTakeItem(), WorldSession::HandleMailTakeMoney(), and WorldSession::HandleSendMail().

◆ SendMessageToSet() [1/2]

void Player::SendMessageToSet ( WorldPacket const *  data,
bool  self 
) const
overridevirtual

◆ SendMessageToSet() [2/2]

void Player::SendMessageToSet ( WorldPacket const *  data,
Player const *  skipped_rcvr 
) const
overridevirtual

Reimplemented from WorldObject.

5703{
5704 if (skipped_rcvr != this)
5705 SendDirectMessage(data);
5706
5707 Acore::MessageDistDeliverer notifier(this, data, 0.0f, false, skipped_rcvr);
5708 notifier.Visit(GetObjectVisibilityContainer().GetVisiblePlayersMap());
5709}

References WorldObject::GetObjectVisibilityContainer(), SendDirectMessage(), and Acore::MessageDistDeliverer::Visit().

◆ SendMessageToSetInRange()

void Player::SendMessageToSetInRange ( WorldPacket const *  data,
float  dist,
bool  self 
) const
overridevirtual

Reimplemented from WorldObject.

5694{
5695 if (self)
5696 SendDirectMessage(data);
5697
5698 Acore::MessageDistDeliverer notifier(this, data, dist);
5699 notifier.Visit(GetObjectVisibilityContainer().GetVisiblePlayersMap());
5700}

References WorldObject::GetObjectVisibilityContainer(), SendDirectMessage(), and Acore::MessageDistDeliverer::Visit().

Referenced by AchievementMgr::SendAchievementEarned(), and SendMessageToSet().

◆ SendMirrorTimer()

void Player::SendMirrorTimer ( MirrorTimerType  Type,
uint32  MaxValue,
uint32  CurrentValue,
int32  Regen 
)
protected
746{
747 if (int(MaxValue) == DISABLED_MIRROR_TIMER)
748 {
749 if (int(CurrentValue) != DISABLED_MIRROR_TIMER)
750 StopMirrorTimer(Type);
751 return;
752 }
753 SendDirectMessage(WorldPackets::Misc::StartMirrorTimer(Type, CurrentValue, MaxValue, Regen, 0, 0).Write());
754}
Definition MiscPackets.h:144

References DISABLED_MIRROR_TIMER, SendDirectMessage(), and StopMirrorTimer().

Referenced by HandleDrowning().

◆ SendMovieStart()

void Player::SendMovieStart ( uint32  MovieId)
5728{
5730 data << uint32(MovieId);
5731 SendDirectMessage(&data);
5732}
@ SMSG_TRIGGER_MOVIE
Definition Opcodes.h:1154

References SendDirectMessage(), and SMSG_TRIGGER_MOVIE.

Referenced by debug_commandscript::HandleDebugPlayMovieCommand().

◆ SendNewItem()

void Player::SendNewItem ( Item item,
uint32  count,
bool  received,
bool  created,
bool  broadcast = false,
bool  sendChatMessage = true 
)
4757{
4758 if (!item) // prevent crash
4759 return;
4760
4761 // last check 2.0.10
4762 WorldPacket data(SMSG_ITEM_PUSH_RESULT, (8 + 4 + 4 + 4 + 1 + 4 + 4 + 4 + 4 + 4));
4763 data << GetGUID(); // player GUID
4764 data << uint32(received); // 0=looted, 1=from npc
4765 data << uint32(created); // 0=received, 1=created
4766 data << uint32(sendChatMessage); // bool print message to chat
4767 data << uint8(item->GetBagSlot()); // bagslot
4768 // item slot, but when added to stack: 0xFFFFFFFF
4769 data << uint32((item->GetCount() == count) ? item->GetSlot() : -1);
4770 data << uint32(item->GetEntry()); // item id
4771 data << uint32(item->GetItemSuffixFactor()); // SuffixFactor
4772 data << int32(item->GetItemRandomPropertyId()); // random item property id
4773 data << uint32(count); // count of items
4774 data << uint32(GetItemCount(item->GetEntry())); // count of items in inventory
4775
4776 if (broadcast && GetGroup())
4777 GetGroup()->BroadcastPacket(&data, true);
4778 else
4779 SendDirectMessage(&data);
4780}
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1757
@ SMSG_ITEM_PUSH_RESULT
Definition Opcodes.h:388

References Group::BroadcastPacket(), Item::GetBagSlot(), Item::GetCount(), Object::GetEntry(), GetGroup(), Object::GetGUID(), GetItemCount(), Item::GetItemRandomPropertyId(), Item::GetItemSuffixFactor(), Item::GetSlot(), SendDirectMessage(), and SMSG_ITEM_PUSH_RESULT.

Referenced by _StoreOrEquipNewItem(), AddItem(), AutoStoreLoot(), Spell::DoCreateItem(), GiveQuestSourceItem(), misc_commandscript::HandleAddItemCommand(), misc_commandscript::HandleAddItemSetCommand(), AuraEffect::HandleChannelDeathItem(), OPvPCapturePointNA::HandleCustomSpell(), WorldSession::HandleLootMasterGiveOpcode(), WorldSession::HandlePetitionBuyOpcode(), RefundItem(), RemovePet(), RewardQuest(), npc_oculus_drakegiver::StoreEssence(), and StoreLootItem().

◆ SendNewMail()

void Player::SendNewMail ( )
2877{
2878 // deliver undelivered mail
2880 data << (uint32) 0;
2881 SendDirectMessage(&data);
2882}
@ SMSG_RECEIVED_MAIL
Definition Opcodes.h:675

References SendDirectMessage(), and SMSG_RECEIVED_MAIL.

Referenced by AddNewMailDeliverTime(), and Update().

◆ SendNotifyLootItemRemoved()

void Player::SendNotifyLootItemRemoved ( uint8  lootSlot)
8238{
8240 data << uint8(lootSlot);
8241 SendDirectMessage(&data);
8242}
@ SMSG_LOOT_REMOVED
Definition Opcodes.h:384

References SendDirectMessage(), and SMSG_LOOT_REMOVED.

Referenced by Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), and StoreLootItem().

◆ SendNotifyLootMoneyRemoved()

void Player::SendNotifyLootMoneyRemoved ( )
8232{
8234 SendDirectMessage(&data);
8235}
@ SMSG_LOOT_CLEAR_MONEY
Definition Opcodes.h:387

References SendDirectMessage(), and SMSG_LOOT_CLEAR_MONEY.

Referenced by Loot::NotifyMoneyRemoved().

◆ SendPreparedGossip()

void Player::SendPreparedGossip ( WorldObject source)
210{
211 if (!source)
212 return;
213
214 if (source->IsCreature())
215 {
216 // in case no gossip flag and quest menu not empty, open quest menu (client expect gossip menu with this flag)
218 {
219 SendPreparedQuest(source->GetGUID());
220 return;
221 }
222 }
223 else if (source->IsGameObject())
224 {
225 // probably need to find a better way here
227 {
228 SendPreparedQuest(source->GetGUID());
229 return;
230 }
231 }
232
233 // in case non empty gossip menu (that not included quests list size) show it
234 // (quest entries from quest menu will be included in list)
235
236 uint32 textId = GetGossipTextId(source);
237
239 textId = GetGossipTextId(menuId, source);
240
241 PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
242}
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:319
void SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
Definition GossipDef.cpp:193
bool Empty() const
Definition GossipDef.h:242

References QuestMenu::Empty(), PlayerMenu::GetGossipMenu(), GetGossipTextId(), Object::GetGUID(), GossipMenu::GetMenuId(), PlayerMenu::GetQuestMenu(), Unit::HasNpcFlag(), Object::IsCreature(), Object::IsGameObject(), PlayerTalkClass, PlayerMenu::SendGossipMenu(), SendPreparedQuest(), Object::ToCreature(), and UNIT_NPC_FLAG_GOSSIP.

Referenced by WorldSession::HandleGossipHelloOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), npc_thrall_old_hillsbrad::OnGossipHello(), go_apexis_relic::OnGossipHello(), OnGossipSelect(), Spell::SendLoot(), npc_maredis_firestar::npc_maredis_firestarAI::sGossipHello(), and GameObject::Use().

◆ SendPreparedQuest()

void Player::SendPreparedQuest ( ObjectGuid  guid)
Todo:
verify if check for !quest->IsDaily() is really correct (possibly not)
116{
117 QuestMenu& questMenu = PlayerTalkClass->GetQuestMenu();
118 if (questMenu.Empty())
119 return;
120
121 // single element case
122 if (questMenu.GetMenuItemCount() == 1)
123 {
124 QuestMenuItem const& qmi0 = questMenu.GetItem(0);
125 uint32 questId = qmi0.QuestId;
126
127 // Auto open -- maybe also should verify there is no greeting
128 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
129 {
130 if (qmi0.QuestIcon == 4)
131 PlayerTalkClass->SendQuestGiverRequestItems(quest, guid, CanRewardQuest(quest, false), true);
132 // Send completable on repeatable and autoCompletable quest if player don't have quest
134 else
135 {
137 if (!object || (!object->hasQuest(questId) && !object->hasInvolvedQuest(questId)))
138 {
140 return;
141 }
142
143 if (quest->IsAutoAccept() && CanAddQuest(quest, true) && CanTakeQuest(quest, true))
144 AddQuestAndCheckCompletion(quest, object);
145
146 if (quest->IsAutoComplete() || !quest->GetQuestMethod())
148 else
150 }
151 }
152 }
153 // multiple entries
154 else
155 {
156 QEmote qe;
157 qe._Delay = 0;
158 qe._Emote = 0;
159 std::string title = "";
160
161 // need pet case for some quests
163 if (creature)
164 {
165 uint32 textid = GetGossipTextId(creature);
166 GossipText const* gossiptext = sObjectMgr->GetGossipText(textid);
167 if (!gossiptext)
168 {
169 qe._Delay = 0; //TEXTEMOTE_MESSAGE; //zyg: player emote
170 qe._Emote = 0; //TEXTEMOTE_HELLO; //zyg: NPC emote
171 title = "";
172 }
173 else
174 {
175 qe = gossiptext->Options[0].Emotes[0];
176
177 if (!gossiptext->Options[0].Text_0.empty())
178 {
179 title = gossiptext->Options[0].Text_0;
180
181 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
182 if (loc_idx >= 0)
183 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
184 ObjectMgr::GetLocaleString(npcTextLocale->Text_0[0], loc_idx, title);
185 }
186 else
187 {
188 title = gossiptext->Options[0].Text_1;
189
190 int loc_idx = GetSession()->GetSessionDbLocaleIndex();
191 if (loc_idx >= 0)
192 if (NpcTextLocale const* npcTextLocale = sObjectMgr->GetNpcTextLocale(textid))
193 ObjectMgr::GetLocaleString(npcTextLocale->Text_1[0], loc_idx, title);
194 }
195 }
196 }
197
199 }
200}
@ TYPEMASK_ITEM
Definition ObjectGuid.h:47
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
Definition Object.h:104
virtual bool hasQuest(uint32) const
Definition Object.h:190
virtual bool hasInvolvedQuest(uint32) const
Definition Object.h:191
void SendQuestGiverQuestList(QEmote const &eEmote, std::string const &Title, ObjectGuid guid)
Definition GossipDef.cpp:315
void SendQuestGiverQuestDetails(Quest const *quest, ObjectGuid npcGUID, bool activateAccept) const
Definition GossipDef.cpp:388
void SendQuestGiverRequestItems(Quest const *quest, ObjectGuid npcGUID, bool canComplete, bool closeOnCancel) const
Definition GossipDef.cpp:752
bool CanAddQuest(Quest const *quest, bool msg)
Definition PlayerQuest.cpp:264
void AddQuestAndCheckCompletion(Quest const *quest, Object *questGiver)
Definition PlayerQuest.cpp:421
bool CanCompleteRepeatableQuest(Quest const *quest)
Definition PlayerQuest.cpp:366
QuestMenuItem const & GetItem(uint16 index) const
Definition GossipDef.h:249
uint8 GetMenuItemCount() const
Definition GossipDef.h:237
std::string Text_0
Definition NPCHandler.h:34
QEmote Emotes[MAX_GOSSIP_TEXT_EMOTES]
Definition NPCHandler.h:39
std::string Text_1
Definition NPCHandler.h:35
Definition NPCHandler.h:45
GossipTextOption Options[MAX_GOSSIP_TEXT_OPTIONS]
Definition NPCHandler.h:46
Definition NPCHandler.h:55
Definition NPCHandler.h:25
uint32 _Emote
Definition NPCHandler.h:26
uint32 _Delay
Definition NPCHandler.h:27
Definition GossipDef.h:155
uint32 QuestId
Definition GossipDef.h:156
uint8 QuestIcon
Definition GossipDef.h:157

References QEmote::_Delay, QEmote::_Emote, AddQuestAndCheckCompletion(), CanAddQuest(), CanCompleteRepeatableQuest(), CanRewardQuest(), CanTakeQuest(), GossipTextOption::Emotes, QuestMenu::Empty(), ObjectAccessor::GetCreatureOrPetOrVehicle(), GetGossipTextId(), QuestMenu::GetItem(), ObjectMgr::GetLocaleString(), QuestMenu::GetMenuItemCount(), ObjectAccessor::GetObjectByTypeMask(), PlayerMenu::GetQuestMenu(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Object::hasInvolvedQuest(), Object::hasQuest(), GossipText::Options, PlayerTalkClass, QuestMenuItem::QuestIcon, QuestMenuItem::QuestId, PlayerMenu::SendCloseGossip(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestGiverQuestList(), PlayerMenu::SendQuestGiverRequestItems(), sObjectMgr, GossipTextOption::Text_0, GossipTextOption::Text_1, TYPEMASK_GAMEOBJECT, TYPEMASK_ITEM, and TYPEMASK_UNIT.

Referenced by npc_cos_chromie_middle::OnGossipHello(), OnGossipSelect(), SendPreparedGossip(), npc_costumed_orphan_matron::sGossipHello(), and npc_maredis_firestar::npc_maredis_firestarAI::sGossipSelect().

◆ SendProficiency()

void Player::SendProficiency ( ItemClass  itemClass,
uint32  itemSubclassMask 
)
10132{
10133 WorldPacket data(SMSG_SET_PROFICIENCY, 1 + 4);
10134 data << uint8(itemClass) << uint32(itemSubclassMask);
10135 SendDirectMessage(&data);
10136}
@ SMSG_SET_PROFICIENCY
Definition Opcodes.h:325

References SendDirectMessage(), and SMSG_SET_PROFICIENCY.

Referenced by Spell::EffectProficiency().

◆ SendPushToPartyResponse()

void Player::SendPushToPartyResponse ( Player const *  player,
uint8  msg 
) const
2436{
2437 if (player)
2438 {
2439 WorldPacket data(MSG_QUEST_PUSH_RESULT, (8 + 1));
2440 data << player->GetGUID();
2441 data << uint8(msg); // valid values: 0-8
2442 SendDirectMessage(&data);
2443 LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
2444 }
2445}
@ MSG_QUEST_PUSH_RESULT
Definition Opcodes.h:660

References Object::GetGUID(), LOG_DEBUG, MSG_QUEST_PUSH_RESULT, and SendDirectMessage().

Referenced by CanShareQuest(), debug_commandscript::HandleDebugSendQuestPartyMsgCommand(), WorldSession::HandlePushQuestToParty(), and WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestComplete()

void Player::SendQuestComplete ( uint32  quest_id)
2347{
2348 if (quest_id)
2349 {
2351 data << uint32(quest_id);
2352 SendDirectMessage(&data);
2353 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = {}", quest_id);
2354 }
2355}
@ SMSG_QUESTUPDATE_COMPLETE
Definition Opcodes.h:438

References LOG_DEBUG, SendDirectMessage(), and SMSG_QUESTUPDATE_COMPLETE.

Referenced by AreaExploredOrEventHappens().

◆ SendQuestConfirmAccept()

void Player::SendQuestConfirmAccept ( Quest const *  quest,
Player pReceiver 
)
2414{
2415 if (pReceiver)
2416 {
2417 //load locale from db
2418 std::string strTitle = quest->GetTitle();
2419
2420 int loc_idx = pReceiver->GetSession()->GetSessionDbLocaleIndex();
2421 if (loc_idx >= 0)
2422 if (const QuestLocale* pLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
2423 ObjectMgr::GetLocaleString(pLocale->Title, loc_idx, strTitle);
2424
2425 WorldPacket data(SMSG_QUEST_CONFIRM_ACCEPT, (4 + quest->GetTitle().size() + 8));
2426 data << uint32(quest->GetQuestId());
2427 data << quest->GetTitle();
2428 data << GetGUID();
2429 pReceiver->SendDirectMessage(&data);
2430
2431 LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_CONFIRM_ACCEPT");
2432 }
2433}
@ SMSG_QUEST_CONFIRM_ACCEPT
Definition Opcodes.h:442

References Object::GetGUID(), ObjectMgr::GetLocaleString(), Quest::GetQuestId(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), Quest::GetTitle(), LOG_DEBUG, SendDirectMessage(), SMSG_QUEST_CONFIRM_ACCEPT, and sObjectMgr.

Referenced by WorldSession::HandleQuestgiverAcceptQuestOpcode().

◆ SendQuestFailed()

void Player::SendQuestFailed ( uint32  questId,
InventoryResult  reason = EQUIP_ERR_OK 
)
2383{
2384 if (questId)
2385 {
2387 data << uint32(questId);
2388 data << uint32(reason); // failed reason (valid reasons: 4, 16, 50, 17, 74, other values show default message)
2389 SendDirectMessage(&data);
2390 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_FAILED");
2391 }
2392}
@ SMSG_QUESTGIVER_QUEST_FAILED
Definition Opcodes.h:432

References LOG_DEBUG, SendDirectMessage(), and SMSG_QUESTGIVER_QUEST_FAILED.

Referenced by FailQuest().

◆ SendQuestGiverStatusMultiple()

void Player::SendQuestGiverStatusMultiple ( )
protected
7744{
7745 if (GetObjectVisibilityContainer().GetVisibleWorldObjectsMap()->empty())
7746 return;
7747
7748 uint32 count = 0;
7749
7751 data << uint32(count); // placeholder
7752
7753 DoForAllVisibleWorldObjects([this, &data, &count](WorldObject* worldObject)
7754 {
7755 uint32 questStatus = DIALOG_STATUS_NONE;
7756
7757 if (worldObject->IsCreature())
7758 {
7759 // need also pet quests case support
7760 Creature* questgiver = worldObject->ToCreature();
7761 if (!questgiver || questgiver->IsHostileTo(this))
7762 return;
7763 if (!questgiver->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))
7764 return;
7765
7766 questStatus = GetQuestDialogStatus(questgiver);
7767
7768 data << questgiver->GetGUID();
7769 data << uint8(questStatus);
7770 ++count;
7771 }
7772 else if (worldObject->IsGameObject())
7773 {
7774 GameObject* questgiver = worldObject->ToGameObject();
7775 if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER)
7776 return;
7777
7778 questStatus = GetQuestDialogStatus(questgiver);
7779
7780 data << questgiver->GetGUID();
7781 data << uint8(questStatus);
7782 ++count;
7783 }
7784 });
7785
7786 data.put<uint32>(0, count); // write real count
7787 SendDirectMessage(&data);
7788}
void DoForAllVisibleWorldObjects(Worker &&worker)
Definition Object.h:583
@ SMSG_QUESTGIVER_STATUS_MULTIPLE
Definition Opcodes.h:1078

References DIALOG_STATUS_NONE, WorldObject::DoForAllVisibleWorldObjects(), WorldObject::GetObjectVisibilityContainer(), Object::IsCreature(), Object::IsGameObject(), ByteBuffer::put(), SendDirectMessage(), and SMSG_QUESTGIVER_STATUS_MULTIPLE.

Referenced by GiveLevel(), WorldSession::HandleDestroyItemOpcode(), WorldSession::HandleQuestgiverStatusMultipleQuery(), RewardQuest(), and SendInitialPacketsAfterAddToMap().

◆ SendQuestReward()

void Player::SendQuestReward ( Quest const *  quest,
uint32  XP 
)
2358{
2359 uint32 questid = quest->GetQuestId();
2360 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTGIVER_QUEST_COMPLETE quest = {}", questid);
2361 sGameEventMgr->HandleQuestComplete(questid);
2362 WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4 + 4 + 4 + 4 + 4));
2363 data << uint32(questid);
2364
2365 if (!IsMaxLevel())
2366 {
2367 data << uint32(XP);
2368 data << uint32(quest->GetRewOrReqMoney(GetLevel()));
2369 }
2370 else
2371 {
2372 data << uint32(0);
2373 data << uint32(quest->GetRewOrReqMoney(GetLevel()) + quest->GetRewMoneyMaxLevel());
2374 }
2375
2376 data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
2377 data << uint32(quest->GetBonusTalents()); // bonus talents
2378 data << uint32(quest->GetRewArenaPoints());
2379 SendDirectMessage(&data);
2380}
bool IsMaxLevel() const
Definition Player.cpp:2555
@ SMSG_QUESTGIVER_QUEST_COMPLETE
Definition Opcodes.h:431

References Quest::CalculateHonorGain(), Quest::GetBonusTalents(), Unit::GetLevel(), Quest::GetQuestId(), GetQuestLevel(), Quest::GetRewArenaPoints(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), IsMaxLevel(), LOG_DEBUG, SendDirectMessage(), sGameEventMgr, and SMSG_QUESTGIVER_QUEST_COMPLETE.

Referenced by RewardQuest().

◆ SendQuestTimerFailed()

void Player::SendQuestTimerFailed ( uint32  quest_id)
2395{
2396 if (quest_id)
2397 {
2399 data << uint32(quest_id);
2400 SendDirectMessage(&data);
2401 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
2402 }
2403}
@ SMSG_QUESTUPDATE_FAILEDTIMER
Definition Opcodes.h:437

References LOG_DEBUG, SendDirectMessage(), and SMSG_QUESTUPDATE_FAILEDTIMER.

Referenced by FailQuest().

◆ SendQuestUpdate()

void Player::SendQuestUpdate ( uint32  questId)
1527{
1528 uint32 zone = 0, area = 0;
1529 // xinef: fixup
1530 uint32 oldSpellId = 0;
1531
1532 SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestMapBounds(questId);
1533 if (saBounds.first != saBounds.second)
1534 {
1535 GetZoneAndAreaId(zone, area);
1536
1537 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1538 {
1539 // xinef: spell was already casted, skip different areas with same spell
1540 if (itr->second->spellId == oldSpellId)
1541 continue;
1542 if (itr->second->autocast && itr->second->IsFitToRequirements(this, zone, area))
1543 if (!HasAura(itr->second->spellId))
1544 {
1545 CastSpell(this, itr->second->spellId, true);
1546 oldSpellId = itr->second->spellId;
1547 }
1548 }
1549 }
1550
1551 saBounds = sSpellMgr->GetSpellAreaForQuestEndMapBounds(questId);
1552
1553 // xinef: fixup
1554 uint32 skipSpellId = 0;
1555 oldSpellId = 0;
1556 if (saBounds.first != saBounds.second)
1557 {
1558 if (!zone || !area)
1559 GetZoneAndAreaId(zone, area);
1560
1561 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
1562 {
1563 // xinef: skip spell for which condition is already fulfilled
1564 if (itr->second->spellId == skipSpellId)
1565 continue;
1566 skipSpellId = 0;
1567
1568 // xinef: spells are sorted, if no condition is fulfilled remove aura
1569 if (oldSpellId && oldSpellId != itr->second->spellId)
1570 {
1571 RemoveAurasDueToSpell(oldSpellId);
1572 oldSpellId = 0;
1573 }
1574
1575 if (!itr->second->IsFitToRequirements(this, zone, area))
1576 {
1577 //RemoveAurasDueToSpell(itr->second->spellId);
1578 oldSpellId = itr->second->spellId;
1579 }
1580 else
1581 {
1582 skipSpellId = itr->second->spellId;
1583 oldSpellId = 0;
1584 }
1585 }
1586
1587 // xinef: check if we have something to remove yet
1588 if (oldSpellId)
1589 RemoveAurasDueToSpell(oldSpellId);
1590 }
1591
1593}
std::pair< SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator > SpellAreaForQuestMapBounds
Definition SpellMgr.h:548

References Unit::CastSpell(), WorldObject::GetZoneAndAreaId(), Unit::HasAura(), Unit::RemoveAurasDueToSpell(), sSpellMgr, and UpdateForQuestWorldObjects().

Referenced by AddQuest(), RemoveActiveQuest(), RemoveRewardedQuest(), RewardQuest(), and SetQuestStatus().

◆ SendQuestUpdateAddCreatureOrGo()

void Player::SendQuestUpdateAddCreatureOrGo ( Quest const *  quest,
ObjectGuid  guid,
uint32  creatureOrGO_idx,
uint16  old_count,
uint16  add_count 
)
2457{
2458 ASSERT(old_count + add_count < 65536 && "mob/GO count store in 16 bits 2^16 = 65536 (0..65536)");
2459
2460 int32 entry = quest->RequiredNpcOrGo[ creatureOrGO_idx ];
2461 if (entry < 0)
2462 // client expected gameobject template id in form (id|0x80000000)
2463 entry = (-entry) | 0x80000000;
2464
2465 WorldPacket data(SMSG_QUESTUPDATE_ADD_KILL, (4 * 4 + 8));
2466 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_KILL");
2467 data << uint32(quest->GetQuestId());
2468 data << uint32(entry);
2469 data << uint32(old_count + add_count);
2470 data << uint32(quest->RequiredNpcOrGoCount[ creatureOrGO_idx ]);
2471 data << guid;
2472 SendDirectMessage(&data);
2473
2474 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2475 if (log_slot < MAX_QUEST_LOG_SIZE)
2476 SetQuestSlotCounter(log_slot, creatureOrGO_idx, GetQuestSlotCounter(log_slot, creatureOrGO_idx) + add_count);
2477}
uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const
Definition Player.h:1484
@ SMSG_QUESTUPDATE_ADD_KILL
Definition Opcodes.h:439

References ASSERT, FindQuestSlot(), Quest::GetQuestId(), GetQuestSlotCounter(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendDirectMessage(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_KILL.

Referenced by KillCreditGO(), KilledMonsterCredit(), and TalkedToCreature().

◆ SendQuestUpdateAddItem()

void Player::SendQuestUpdateAddItem ( Quest const *  quest,
uint32  item_idx,
uint16  count 
)
2448{
2450 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_ITEM");
2451 //data << quest->RequiredItemId[item_idx];
2452 //data << count;
2453 SendDirectMessage(&data);
2454}
@ SMSG_QUESTUPDATE_ADD_ITEM
Definition Opcodes.h:440

References LOG_DEBUG, SendDirectMessage(), and SMSG_QUESTUPDATE_ADD_ITEM.

◆ SendQuestUpdateAddPlayer()

void Player::SendQuestUpdateAddPlayer ( Quest const *  quest,
uint16  old_count,
uint16  add_count 
)
2480{
2481 ASSERT(old_count + add_count < 65536 && "player count store in 16 bits");
2482
2484 LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
2485 data << uint32(quest->GetQuestId());
2486 data << uint32(old_count + add_count);
2487 data << uint32(quest->GetPlayersSlain());
2488 SendDirectMessage(&data);
2489
2490 uint16 log_slot = FindQuestSlot(quest->GetQuestId());
2491 if (log_slot < MAX_QUEST_LOG_SIZE)
2493}
@ SMSG_QUESTUPDATE_ADD_PVP_KILL
Definition Opcodes.h:1165

References ASSERT, FindQuestSlot(), Quest::GetPlayersSlain(), Quest::GetQuestId(), GetQuestSlotCounter(), LOG_DEBUG, MAX_QUEST_LOG_SIZE, QUEST_PVP_KILL_SLOT, SendDirectMessage(), SetQuestSlotCounter(), and SMSG_QUESTUPDATE_ADD_PVP_KILL.

Referenced by KilledPlayerCreditForQuest().

◆ SendRaidDifficulty()

void Player::SendRaidDifficulty ( bool  IsInGroup,
int32  forcedDifficulty = -1 
)
178{
179 uint8 val = 0x00000001;
181 data << uint32(forcedDifficulty == -1 ? GetRaidDifficulty() : forcedDifficulty);
182 data << uint32(val);
183 data << uint32(IsInGroup);
184 SendDirectMessage(&data);
185}
@ MSG_SET_RAID_DIFFICULTY
Definition Opcodes.h:1289

References GetRaidDifficulty(), MSG_SET_RAID_DIFFICULTY, and SendDirectMessage().

Referenced by Group::AddMember(), WorldSession::HandleSetRaidDifficultyOpcode(), SendInitialPacketsAfterAddToMap(), and Group::SetRaidDifficulty().

◆ SendRaidInfo()

void Player::SendRaidInfo ( )
6534{
6535 uint32 counter = 0;
6536
6538
6539 std::size_t p_counter = data.wpos();
6540 data << uint32(counter); // placeholder
6541
6542 time_t now = GameTime::GetGameTime().count();
6543
6544 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6545 {
6546 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6547 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6548 {
6549 if (itr->second.perm)
6550 {
6551 InstanceSave* save = itr->second.save;
6552 time_t resetTime = itr->second.extended ? save->GetExtendedResetTime() : save->GetResetTime();
6553 data << uint32(save->GetMapId()); // map id
6554 data << uint32(save->GetDifficulty()); // difficulty
6555 data << ObjectGuid::Create<HighGuid::Instance>(save->GetInstanceId()); // instance id
6556 data << uint8(1); // expired = 0
6557 data << uint8(itr->second.extended ? 1 : 0);// extended = 1
6558 data << uint32(resetTime >= now ? resetTime - now : 0); // reset time
6559 ++counter;
6560 }
6561 }
6562 }
6563 data.put<uint32>(p_counter, counter);
6564 SendDirectMessage(&data);
6565}
Difficulty GetDifficulty() const
Definition InstanceSaveMgr.h:63
@ SMSG_RAID_INSTANCE_INFO
Definition Opcodes.h:746

References InstanceSave::GetDifficulty(), InstanceSave::GetExtendedResetTime(), GameTime::GetGameTime(), Object::GetGUID(), InstanceSave::GetInstanceId(), InstanceSave::GetMapId(), InstanceSave::GetResetTime(), MAX_DIFFICULTY, ByteBuffer::put(), SendDirectMessage(), sInstanceSaveMgr, SMSG_RAID_INSTANCE_INFO, and ByteBuffer::wpos().

Referenced by WorldSession::HandleRequestRaidInfoOpcode().

◆ SendRefundInfo()

void Player::SendRefundInfo ( Item item)
private
15638{
15639 // This function call unsets ITEM_FLAGS_REFUNDABLE if played time is over 2 hours.
15640 item->UpdatePlayedTime(this);
15641
15642 if (!item->IsRefundable())
15643 {
15644 LOG_DEBUG("entities.player.items", "Item refund: item not refundable!");
15645 return;
15646 }
15647
15648 if (GetGUID().GetCounter() != item->GetRefundRecipient()) // Formerly refundable item got traded
15649 {
15650 LOG_DEBUG("entities.player.items", "Item refund: item was traded!");
15651 item->SetNotRefundable(this);
15652 return;
15653 }
15654
15655 ItemExtendedCostEntry const* iece = sItemExtendedCostStore.LookupEntry(item->GetPaidExtendedCost());
15656 if (!iece)
15657 {
15658 LOG_DEBUG("entities.player.items", "Item refund: cannot find extendedcost data.");
15659 return;
15660 }
15661
15662 WorldPacket data(SMSG_ITEM_REFUND_INFO_RESPONSE, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4);
15663 data << item->GetGUID(); // item guid
15664 data << uint32(item->GetPaidMoney()); // money cost
15665 data << uint32(iece->reqhonorpoints); // honor point cost
15666 data << uint32(iece->reqarenapoints); // arena point cost
15667 for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
15668 {
15669 data << uint32(iece->reqitem[i]);
15670 data << uint32(iece->reqitemcount[i]);
15671 }
15672 data << uint32(0);
15673 data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
15674 SendDirectMessage(&data);
15675}
uint32 GetTotalPlayedTime()
Definition Player.h:1192
@ SMSG_ITEM_REFUND_INFO_RESPONSE
Definition Opcodes.h:1232

References Object::GetGUID(), Object::GetGUID(), Item::GetPaidExtendedCost(), Item::GetPaidMoney(), Item::GetPlayedTime(), Item::GetRefundRecipient(), GetTotalPlayedTime(), Item::IsRefundable(), LOG_DEBUG, MAX_ITEM_EXTENDED_COST_REQUIREMENTS, ItemExtendedCostEntry::reqarenapoints, ItemExtendedCostEntry::reqhonorpoints, ItemExtendedCostEntry::reqitem, ItemExtendedCostEntry::reqitemcount, SendDirectMessage(), Item::SetNotRefundable(), sItemExtendedCostStore, SMSG_ITEM_REFUND_INFO_RESPONSE, and Item::UpdatePlayedTime().

Referenced by WorldSession::HandleItemRefundInfoRequest(), and SwapItem().

◆ SendRemoveControlBar()

void Player::SendRemoveControlBar ( )
9782{
9784 data << uint64(0);
9785 SendDirectMessage(&data);
9786}

References SendDirectMessage(), and SMSG_PET_SPELLS.

Referenced by Unit::RemoveCharmedBy(), and Unit::SetMinion().

◆ SendResetFailedNotify()

void Player::SendResetFailedNotify ( uint32  mapid)
188{
190 data << uint32(mapid);
191 SendDirectMessage(&data);
192}
@ SMSG_RESET_FAILED_NOTIFY
Definition Opcodes.h:948

References SendDirectMessage(), and SMSG_RESET_FAILED_NOTIFY.

◆ SendResetInstanceFailed()

void Player::SendResetInstanceFailed ( uint32  reason,
uint32  MapId 
)
334{
335 /*reasons for instance reset failure:
336 // 0: There are players inside the instance.
337 // 1: There are players offline in your party.
338 // 2>: There are players in your party attempting to zone into an instance.
339 */
341 data << uint32(reason);
342 data << uint32(MapId);
343 SendDirectMessage(&data);
344}
@ SMSG_INSTANCE_RESET_FAILED
Definition Opcodes.h:829

References SendDirectMessage(), and SMSG_INSTANCE_RESET_FAILED.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendResetInstanceSuccess()

void Player::SendResetInstanceSuccess ( uint32  MapId)
327{
329 data << uint32(MapId);
330 SendDirectMessage(&data);
331}
@ SMSG_INSTANCE_RESET
Definition Opcodes.h:828

References SendDirectMessage(), and SMSG_INSTANCE_RESET.

Referenced by ResetInstances(), and Group::ResetInstances().

◆ SendRespondInspectAchievements()

void Player::SendRespondInspectAchievements ( Player player) const
13964{
13966}
void SendRespondInspectAchievements(Player *player) const
Definition AchievementMgr.cpp:2384

References m_achievementMgr, and AchievementMgr::SendRespondInspectAchievements().

Referenced by WorldSession::HandleQueryInspectAchievements().

◆ SendSavedInstances()

void Player::SendSavedInstances ( )
6571{
6572 bool hasBeenSaved = false;
6573 WorldPacket data;
6574
6575 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6576 {
6577 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6578 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6579 {
6580 if (itr->second.perm) // only permanent binds are sent
6581 {
6582 hasBeenSaved = true;
6583 break;
6584 }
6585 }
6586 }
6587
6588 //Send opcode 811. true or false means, whether you have current raid/heroic instances
6590 data << uint32(hasBeenSaved);
6591 SendDirectMessage(&data);
6592
6593 if (!hasBeenSaved)
6594 return;
6595
6596 for (uint8 i = 0; i < MAX_DIFFICULTY; ++i)
6597 {
6598 BoundInstancesMap const& m_boundInstances = sInstanceSaveMgr->PlayerGetBoundInstances(GetGUID(), Difficulty(i));
6599 for (BoundInstancesMap::const_iterator itr = m_boundInstances.begin(); itr != m_boundInstances.end(); ++itr)
6600 {
6601 if (itr->second.perm)
6602 {
6604 data << uint32(itr->second.save->GetMapId());
6605 SendDirectMessage(&data);
6606 }
6607 }
6608 }
6609}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_UPDATE_INSTANCE_OWNERSHIP
Definition Opcodes.h:841
@ SMSG_UPDATE_LAST_INSTANCE
Definition Opcodes.h:830

References Object::GetGUID(), WorldPacket::Initialize(), MAX_DIFFICULTY, SendDirectMessage(), sInstanceSaveMgr, SMSG_UPDATE_INSTANCE_OWNERSHIP, and SMSG_UPDATE_LAST_INSTANCE.

Referenced by TeleportTo().

◆ SendSellError()

void Player::SendSellError ( SellResult  msg,
Creature creature,
ObjectGuid  guid,
uint32  param 
)
4076{
4077 LOG_DEBUG("network", "WORLD: Sent SMSG_SELL_ITEM");
4078 WorldPacket data(SMSG_SELL_ITEM, (8 + 8 + (param ? 4 : 0) + 1)); // last check 2.0.10
4079 data << (creature ? creature->GetGUID() : ObjectGuid::Empty);
4080 data << guid;
4081 if (param > 0)
4082 data << uint32(param);
4083 data << uint8(msg);
4084 SendDirectMessage(&data);
4085}
@ SMSG_SELL_ITEM
Definition Opcodes.h:447

References ObjectGuid::Empty, Object::GetGUID(), LOG_DEBUG, SendDirectMessage(), and SMSG_SELL_ITEM.

Referenced by WorldSession::HandleBuybackItem(), debug_commandscript::HandleDebugSendSellErrorCommand(), WorldSession::HandleSellItemOpcode(), and WorldSession::SendListInventory().

◆ SendSystemMessage()

void Player::SendSystemMessage ( std::string_view  msg,
bool  escapeCharacters = false 
)
16386{
16387 ChatHandler(GetSession()).SendSysMessage(msg, escapeCharacters);
16388}

References GetSession(), and ChatHandler::SendSysMessage().

◆ SendTalentsInfoData()

◆ SendTalentWipeConfirm()

void Player::SendTalentWipeConfirm ( ObjectGuid  guid)
8950{
8951 WorldPacket data(MSG_TALENT_WIPE_CONFIRM, (8 + 4));
8952 data << guid;
8953 uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : resetTalentsCost();
8954 data << cost;
8955 SendDirectMessage(&data);
8956}
@ MSG_TALENT_WIPE_CONFIRM
Definition Opcodes.h:712

References CONFIG_NO_RESET_TALENT_COST, MSG_TALENT_WIPE_CONFIRM, resetTalentsCost(), SendDirectMessage(), and sWorld.

Referenced by Spell::EffectUntrainTalents(), and OnGossipSelect().

◆ SendTaxiNodeStatusMultiple()

void Player::SendTaxiNodeStatusMultiple ( )
10537{
10538 DoForAllVisibleWorldObjects([this](WorldObject* worldObject)
10539 {
10540 Creature* creature = worldObject->ToCreature();
10541 if (!creature || creature->IsHostileTo(this))
10542 return;
10543
10544 if (!creature->HasNpcFlag(UNIT_NPC_FLAG_FLIGHTMASTER))
10545 return;
10546
10547 uint32 nearestNode = sObjectMgr->GetNearestTaxiNode(creature->GetPositionX(), creature->GetPositionY(), creature->GetPositionZ(), creature->GetMapId(), GetTeamId());
10548 if (!nearestNode)
10549 return;
10550
10552 data << creature->GetGUID();
10553 data << uint8(m_taxi.IsTaximaskNodeKnown(nearestNode) ? 1 : 0);
10554 SendDirectMessage(&data);
10555 });
10556}
bool IsTaximaskNodeKnown(uint32 nodeidx) const
Definition PlayerTaxi.h:35
@ SMSG_TAXINODE_STATUS
Definition Opcodes.h:457

References WorldObject::DoForAllVisibleWorldObjects(), Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTeamId(), Unit::HasNpcFlag(), Unit::IsHostileTo(), PlayerTaxi::IsTaximaskNodeKnown(), m_taxi, SendDirectMessage(), SMSG_TAXINODE_STATUS, sObjectMgr, Object::ToCreature(), and UNIT_NPC_FLAG_FLIGHTMASTER.

Referenced by SendInitialPacketsAfterAddToMap().

◆ SendTeleportAckPacket()

void Player::SendTeleportAckPacket ( )
1341{
1343 data << GetPackGUID();
1344 data << GetSession()->GetOrderCounter(); // movement counter
1345 BuildMovementPacket(&data);
1346 SendDirectMessage(&data);
1348}
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19659
@ MSG_MOVE_TELEPORT_ACK
Definition Opcodes.h:229

References Unit::BuildMovementPacket(), WorldSession::GetOrderCounter(), Object::GetPackGUID(), GetSession(), WorldSession::IncrementOrderCounter(), MSG_MOVE_TELEPORT_ACK, and SendDirectMessage().

Referenced by TeleportTo().

◆ SendTransferAborted()

void Player::SendTransferAborted ( uint32  mapid,
TransferAbortReason  reason,
uint8  arg = 0 
)
11768{
11770 data << uint32(mapid);
11771 data << uint8(reason); // transfer abort reason
11772 switch (reason)
11773 {
11777 // these are the ONLY cases that have an extra argument in the packet!!!
11778 data << uint8(arg);
11779 break;
11780 default:
11781 break;
11782 }
11783 SendDirectMessage(&data);
11784}
@ TRANSFER_ABORT_UNIQUE_MESSAGE
Definition Player.h:786
@ TRANSFER_ABORT_INSUF_EXPAN_LVL
Definition Player.h:784
@ SMSG_TRANSFER_ABORTED
Definition Opcodes.h:94

References SendDirectMessage(), SMSG_TRANSFER_ABORTED, TRANSFER_ABORT_DIFFICULTY, TRANSFER_ABORT_INSUF_EXPAN_LVL, and TRANSFER_ABORT_UNIQUE_MESSAGE.

Referenced by InstanceMap::CannotEnter(), MapMgr::PlayerCannotEnter(), Satisfy(), and TeleportTo().

◆ SendUpdateToOutOfRangeGroupMembers()

void Player::SendUpdateToOutOfRangeGroupMembers ( )
11755{
11757 return;
11758 if (Group* group = GetGroup())
11759 group->UpdatePlayerOutOfRange(this);
11760
11763 if (Pet* pet = GetPet())
11764 pet->ResetAuraUpdateMaskForRaid();
11765}
@ GROUP_UPDATE_FLAG_NONE
Definition Group.h:99

References GetGroup(), GetPet(), GROUP_UPDATE_FLAG_NONE, m_auraRaidUpdateMask, and m_groupUpdateMask.

Referenced by Update().

◆ SendUpdateWorldState()

void Player::SendUpdateWorldState ( uint32  variable,
uint32  value 
) const
2227{
2229 worldstate.VariableID = variable;
2230 worldstate.Value = value;
2231 SendDirectMessage(worldstate.Write());
2232}
Definition WorldStatePackets.h:50
int32 Value
Definition WorldStatePackets.h:57
WorldPacket const * Write() override
Definition WorldStatePackets.cpp:40
int32 VariableID
Definition WorldStatePackets.h:56

References SendDirectMessage(), WorldPackets::WorldState::UpdateWorldState::Value, WorldPackets::WorldState::UpdateWorldState::VariableID, and WorldPackets::WorldState::UpdateWorldState::Write().

Referenced by debug_commandscript::HandleDebugUpdateWorldStateCommand(), BfCapturePoint::HandlePlayerEnter(), OPvPCapturePoint::HandlePlayerEnter(), OPvPCapturePointEP_EWT::HandlePlayerEnter(), OPvPCapturePointEP_NPT::HandlePlayerEnter(), OPvPCapturePointEP_CGT::HandlePlayerEnter(), OPvPCapturePointEP_PWT::HandlePlayerEnter(), OPvPCapturePointGH::HandlePlayerEnter(), OPvPCapturePointHP::HandlePlayerEnter(), OPvPCapturePointNA::HandlePlayerEnter(), OPvPCapturePointTF::HandlePlayerEnter(), OPvPCapturePointZM_Beacon::HandlePlayerEnter(), BfCapturePoint::HandlePlayerLeave(), OPvPCapturePoint::HandlePlayerLeave(), OPvPCapturePointEP_EWT::HandlePlayerLeave(), OPvPCapturePointEP_NPT::HandlePlayerLeave(), OPvPCapturePointEP_CGT::HandlePlayerLeave(), OPvPCapturePointEP_PWT::HandlePlayerLeave(), OPvPCapturePointGH::HandlePlayerLeave(), OPvPCapturePointHP::HandlePlayerLeave(), OPvPCapturePointNA::HandlePlayerLeave(), OPvPCapturePointTF::HandlePlayerLeave(), OPvPCapturePointZM_Beacon::HandlePlayerLeave(), npc_wg_queue::OnGossipHello(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerAreaUpdate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnPlayerEnter(), instance_the_black_morass::instance_the_black_morass_InstanceMapScript::OnPlayerEnter(), instance_oculus::instance_oculus_InstanceMapScript::OnPlayerEnter(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::OnPlayerEnter(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), SendBGWeekendWorldStates(), OutdoorPvPEP::SendRemoveWorldStates(), OutdoorPvPGH::SendRemoveWorldStates(), OutdoorPvPHP::SendRemoveWorldStates(), OutdoorPvPNA::SendRemoveWorldStates(), OutdoorPvPSI::SendRemoveWorldStates(), OutdoorPvPTF::SendRemoveWorldStates(), OutdoorPvPZM::SendRemoveWorldStates(), and GameEventMgr::SendWorldStateUpdate().

◆ SetAcceptWhispers()

void Player::SetAcceptWhispers ( bool  on)
inline

◆ SetActiveSpec()

void Player::SetActiveSpec ( uint8  spec)
inline
1738{ m_activeSpec = spec; }

References m_activeSpec.

Referenced by ActivateSpec().

◆ SetAmmo()

void Player::SetAmmo ( uint32  item)
2499{
2500 if (!item)
2501 return;
2502
2503 // already set
2504 if (GetUInt32Value(PLAYER_AMMO_ID) == item)
2505 return;
2506
2507 // check ammo
2508 InventoryResult msg = CanUseAmmo(item);
2509 if (msg != EQUIP_ERR_OK)
2510 {
2511 SendEquipError(msg, nullptr, nullptr, item);
2512 return;
2513 }
2514
2516
2518}

References _ApplyAmmoBonuses(), CanUseAmmo(), EQUIP_ERR_OK, Object::GetUInt32Value(), PLAYER_AMMO_ID, SendEquipError(), and Unit::SetUInt32Value().

Referenced by Create(), and WorldSession::HandleSetAmmoOpcode().

◆ SetArenaPoints()

void Player::SetArenaPoints ( uint32  value)
6289{
6290 if (value > sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS))
6291 value = sWorld->getIntConfig(CONFIG_MAX_ARENA_POINTS);
6293 if (value)
6295}
@ ITEM_ARENA_POINTS_ID
Definition Player.h:956
@ CONFIG_MAX_ARENA_POINTS
Definition WorldConfig.h:198

References AddKnownCurrency(), CONFIG_MAX_ARENA_POINTS, ITEM_ARENA_POINTS_ID, PLAYER_FIELD_ARENA_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), LoadFromDB(), and ModifyArenaPoints().

◆ SetArenaTeamIdInvited()

void Player::SetArenaTeamIdInvited ( uint32  ArenaTeamId)
inline

◆ SetArenaTeamInfoField()

void Player::SetArenaTeamInfoField ( uint8  slot,
ArenaTeamInfoType  type,
uint32  value 
)

◆ SetAtLoginFlag()

void Player::SetAtLoginFlag ( AtLoginFlags  f)
inline

◆ SetAuraUpdateMaskForRaid()

void Player::SetAuraUpdateMaskForRaid ( uint8  slot)
inline
2480{ m_auraRaidUpdateMask |= (uint64(1) << slot); }

References m_auraRaidUpdateMask.

◆ SetBankBagSlotCount()

void Player::SetBankBagSlotCount ( uint8  count)
inline

◆ SetBaseModValue()

void Player::SetBaseModValue ( BaseModGroup  modGroup,
BaseModType  modType,
float  value 
)
inline
2192{ m_auraBaseMod[modGroup][modType] = value; }

References m_auraBaseMod.

Referenced by UpdateAllCritPercentages().

◆ SetBaseRune()

void Player::SetBaseRune ( uint8  index,
RuneType  baseRune 
)
inline
2518{ m_runes->runes[index].BaseRune = baseRune; }

References RuneInfo::BaseRune, m_runes, and Runes::runes.

Referenced by InitRunes().

◆ SetBattlegroundId()

◆ SetBattlegroundOrBattlefieldRaid()

void Player::SetBattlegroundOrBattlefieldRaid ( Group group,
int8  subgroup = -1 
)
13132{
13133 //we must move references from m_group to m_originalGroup
13134 if (GetGroup() && (GetGroup()->isBGGroup() || GetGroup()->isBFGroup()))
13135 {
13136 LOG_INFO("misc", "Player::SetBattlegroundOrBattlefieldRaid - current group is {} group!", (GetGroup()->isBGGroup() ? "BG" : "BF"));
13137 //ABORT(); // pussywizard: origanal group can never be bf/bg group
13138 }
13139
13141
13142 m_group.unlink();
13143 m_group.link(group, this);
13144 m_group.setSubGroup((uint8)subgroup);
13145}
uint8 GetSubGroup() const
Definition Player.h:2476

References GetGroup(), GetSubGroup(), Reference< TO, FROM >::link(), LOG_INFO, m_group, SetOriginalGroup(), GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Battlefield::AddOrSetPlayerToCorrectBfGroup(), and Battleground::AddOrSetPlayerToCorrectBgGroup().

◆ SetBeastMaster()

◆ SetBGData()

void Player::SetBGData ( BGData bgdata)
inline
2264{ m_bgData = bgdata; }

References m_bgData.

◆ SetBindPoint()

void Player::SetBindPoint ( ObjectGuid  guid)
8943{
8945 data << guid;
8946 SendDirectMessage(&data);
8947}
@ SMSG_BINDER_CONFIRM
Definition Opcodes.h:777

References SendDirectMessage(), and SMSG_BINDER_CONFIRM.

Referenced by npc_innkeeper::OnGossipSelect(), and OnGossipSelect().

◆ SetBonusTalentCount()

void Player::SetBonusTalentCount ( uint32  count)
inline
1729{ m_extraBonusTalentCount = count; };

References m_extraBonusTalentCount.

◆ SetCanBlock()

void Player::SetCanBlock ( bool  value)
13182{
13183 if (m_canBlock == value)
13184 return;
13185
13186 m_canBlock = value;
13188}
void UpdateBlockPercentage()
Definition StatSystem.cpp:633

References m_canBlock, and UpdateBlockPercentage().

Referenced by Spell::EffectBlock().

◆ SetCanKnockback()

void Player::SetCanKnockback ( bool  value)
inline
2504{ m_canKnockback = value; }

References m_canKnockback.

Referenced by Unit::KnockbackFrom().

◆ SetCanParry()

void Player::SetCanParry ( bool  value)
13173{
13174 if (m_canParry == value)
13175 return;
13176
13177 m_canParry = value;
13179}
void UpdateParryPercentage()
Definition StatSystem.cpp:752

References m_canParry, and UpdateParryPercentage().

Referenced by Spell::EffectParry(), and AuraEffect::HandleAuraModParryPercent().

◆ SetCanTeleport()

◆ SetCanTitanGrip()

void Player::SetCanTitanGrip ( bool  value)
13191{
13192 m_canTitanGrip = value;
13193}

References m_canTitanGrip.

Referenced by ActivateSpec(), Spell::EffectTitanGrip(), and resetTalents().

◆ SetChampioningFaction()

void Player::SetChampioningFaction ( uint32  faction)
inline
2557{ m_ChampioningFaction = faction; }

References m_ChampioningFaction.

Referenced by AuraEffect::HandleAuraDummy().

◆ setCinematic()

void Player::setCinematic ( uint8  cine)
inline
1831 {
1832 m_cinematic = cine;
1833 }

References m_cinematic.

Referenced by WorldSession::HandlePlayerLoginFromDB().

◆ SetClientControl()

void Player::SetClientControl ( Unit target,
bool  allowMove,
bool  packetOnly = false 
)
12903{
12905 data << target->GetPackGUID();
12906 data << uint8((allowMove && !target->HasUnitState(UNIT_STATE_FLEEING | UNIT_STATE_CONFUSED)) ? 1 : 0);
12907 SendDirectMessage(&data);
12908
12909 // We want to set the packet only
12910 if (packetOnly)
12911 return;
12912
12913 if (this != target)
12914 SetViewpoint(target, allowMove);
12915
12916 if (allowMove)
12917 SetMover(target);
12918
12919 // Xinef: disable moving if target has disable move flag
12920 if (!target->IsCreature())
12921 return;
12922
12923 if (allowMove && target->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
12924 {
12926 target->SetControlled(true, UNIT_STATE_ROOT);
12927 }
12928 else if (!allowMove && target->HasUnitState(UNIT_STATE_ROOT) && !target->HasUnitTypeMask(UNIT_MASK_ACCESSORY))
12929 {
12931 {
12932 // Xinef: restore original orientation, important for shooting vehicles!
12934 target->SetOrientation(pos.GetOrientation());
12935 target->SetFacingTo(pos.GetOrientation());
12936 target->DisableSpline();
12937 }
12938 else
12939 target->SetControlled(false, UNIT_STATE_ROOT);
12940 }
12941}
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:341
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:346
bool IsMOTransport() const
Definition ObjectGuid.h:175
void SetFacingTo(float ori)
Definition Unit.cpp:20280
void DisableSpline()
Definition Unit.cpp:637
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18074
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18787
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:726
@ SMSG_CLIENT_CONTROL_UPDATE
Definition Opcodes.h:375
void SetOrientation(float orientation)
Definition Position.h:116

References Unit::ClearUnitState(), Unit::DisableSpline(), Creature::GetHomePosition(), Position::GetOrientation(), Object::GetPackGUID(), Unit::GetTransGUID(), Creature::GetTransportHomePosition(), Unit::HasUnitFlag(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), Unit::HasUnitTypeMask(), Object::IsCreature(), ObjectGuid::IsMOTransport(), MOVEMENTFLAG_ONTRANSPORT, SendDirectMessage(), Unit::SetControlled(), Unit::SetFacingTo(), SetMover(), Position::SetOrientation(), SetViewpoint(), PackedGuid::size(), SMSG_CLIENT_CONTROL_UPDATE, Object::ToCreature(), UNIT_FLAG_DISABLE_MOVE, UNIT_MASK_ACCESSORY, UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, and UNIT_STATE_ROOT.

Referenced by Battleground::BlockMovement(), WorldSession::HandleMoveTeleportAck(), npc_pilgrims_bounty_chair::PassengerBoarded(), Unit::RemoveCharmedBy(), Unit::SetCharmedBy(), Unit::SetConfused(), and Unit::SetFeared().

◆ SetCommandStatusOff()

◆ SetCommandStatusOn()

◆ SetCommentator()

void Player::SetCommentator ( bool  on)
inline

◆ SetContestedPvPTimer()

void Player::SetContestedPvPTimer ( uint32  newTime)
inline
1864{m_contestedPvPTimer = newTime;}

References m_contestedPvPTimer.

Referenced by Unit::SetContestedPvP().

◆ SetCreationTime()

void Player::SetCreationTime ( Seconds  creationTime)
inline
2542{ m_creationTime = creationTime; }

References m_creationTime.

Referenced by LoadFromDB().

◆ SetCurrentRune()

void Player::SetCurrentRune ( uint8  index,
RuneType  currentRune 
)
inline
2519{ m_runes->runes[index].CurrentRune = currentRune; }

References RuneInfo::CurrentRune, m_runes, and Runes::runes.

Referenced by ConvertRune(), and InitRunes().

◆ SetCurrentTitle()

void Player::SetCurrentTitle ( CharTitlesEntry const *  title,
bool  clear = false 
)
inline
2548{ SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };

References CharTitlesEntry::bit_index, PLAYER_CHOSEN_TITLE, and Unit::SetUInt32Value().

Referenced by SetTitle().

◆ SetDailyQuestStatus()

void Player::SetDailyQuestStatus ( uint32  quest_id)
12141{
12142 if (Quest const* qQuest = sObjectMgr->GetQuestTemplate(quest_id))
12143 {
12144 if (!qQuest->IsDFQuest())
12145 {
12146 for (uint32 quest_daily_idx = 0; quest_daily_idx < PLAYER_MAX_DAILY_QUESTS; ++quest_daily_idx)
12147 {
12148 if (!GetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx))
12149 {
12150 SetUInt32Value(PLAYER_FIELD_DAILY_QUESTS_1 + quest_daily_idx, quest_id);
12151 m_lastDailyQuestTime = GameTime::GetGameTime().count(); // last daily quest time
12152 m_DailyQuestChanged = true;
12153 break;
12154 }
12155 }
12156 }
12157 else
12158 {
12159 m_DFQuests.insert(quest_id);
12161 m_DailyQuestChanged = true;
12162 }
12163 }
12164}

References GameTime::GetGameTime(), Object::GetUInt32Value(), m_DailyQuestChanged, m_DFQuests, m_lastDailyQuestTime, PLAYER_FIELD_DAILY_QUESTS_1, PLAYER_MAX_DAILY_QUESTS, Unit::SetUInt32Value(), and sObjectMgr.

Referenced by RewardQuest().

◆ setDeathState()

void Player::setDeathState ( DeathState  s,
bool  despawn = false 
)
overridevirtual

Reimplemented from Unit.

1029{
1030 uint32 ressSpellId = 0;
1031
1032 bool cur = IsAlive();
1033
1034 if (s == DeathState::JustDied)
1035 {
1036 if (!cur)
1037 {
1038 LOG_ERROR("entities.player", "setDeathState: attempt to kill a dead player {} ({})", GetName(), GetGUID().ToString());
1039 return;
1040 }
1041
1042 // clear all pending spell cast requests when dying
1043 SpellQueue.clear();
1044
1045 // drunken state is cleared on death
1046 SetDrunkValue(0);
1047 // lost combo points at any target (targeted combo points clear in Unit::setDeathState)
1049
1051
1052 //FIXME: is pet dismissed at dying or releasing spirit? if second, add setDeathState(DeathState::Dead) to HandleRepopRequestOpcode and define pet unsummon here with (s == DEAD)
1053 RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT, true);
1054
1055 // save value before aura remove in Unit::setDeathState
1057
1058 // xinef: disable passive area auras!
1060
1061 // passive spell
1062 if (!ressSpellId)
1063 ressSpellId = GetResurrectionSpellId();
1067
1068 // Xinef: reset all death criterias
1070 }
1071 // xinef: enable passive area auras!
1072 else if (s == DeathState::Alive)
1074
1076
1079
1080 // restore resurrection spell id for player after aura remove
1081 if (s == DeathState::JustDied && cur && ressSpellId)
1083
1084 if (IsAlive() && !cur)
1085 //clear aura case after resurrection by another way (spells will be applied before next death)
1087}
@ ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH
Definition DBCEnums.h:88
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP
Definition DBCEnums.h:133
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH
Definition DBCEnums.h:134
@ ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON
Definition DBCEnums.h:135
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
uint32 GetResurrectionSpellId()
Definition Player.cpp:12662
void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete=false)
Definition Player.cpp:13983
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14582

References ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH, ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, Unit::AddUnitState(), Alive, Unit::ClearComboPoints(), clearResurrectRequestData(), Unit::ClearUnitState(), WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetName(), GetResurrectionSpellId(), Object::GetUInt32Value(), Unit::IsAlive(), JustDied, LOG_ERROR, NeedSendSpectatorData(), PET_SAVE_NOT_IN_SLOT, PLAYER_SELF_RES_SPELL, RemovePet(), ResetAchievementCriteria(), ArenaSpectator::SendCommand_UInt32Value(), Unit::setDeathState(), SetDrunkValue(), Unit::SetUInt32Value(), SpellQueue, Position::ToString(), UNIT_STATE_ISOLATED, and UpdateAchievementCriteria().

Referenced by KillPlayer(), and ResurrectPlayer().

◆ SetDeveloper()

void Player::SetDeveloper ( bool  on)
inline

◆ SetDivider()

◆ SetDrunkValue()

void Player::SetDrunkValue ( uint8  newDrunkValue,
uint32  itemId = 0 
)
986{
987 newDrunkValue = std::min<uint8>(newDrunkValue, 100);
988 if (newDrunkValue == GetDrunkValue())
989 return;
990
992 uint32 newDrunkenState = Player::GetDrunkenstateByValue(newDrunkValue);
993
996
997 m_drunkTimer = 0; // reset sobering timer
998
999 if (newDrunkenState == oldDrunkenState)
1000 return;
1001
1003 data.Guid = GetGUID();
1004 data.Threshold = newDrunkenState;
1005 data.ItemID = itemId;
1006
1007 SendMessageToSet(data.Write(), true);
1008}
@ PLAYER_BYTES_3_OFFSET_INEBRIATION
Definition Player.h:523
void UpdateInvisibilityDrunkDetect()
Definition Player.cpp:1010
static DrunkenState GetDrunkenstateByValue(uint8 value)
Definition Player.cpp:974
WorldPacket const * Write() override
Definition MiscPackets.cpp:128
ObjectGuid Guid
Definition MiscPackets.h:198
uint32 Threshold
Definition MiscPackets.h:199
uint32 ItemID
Definition MiscPackets.h:200

References GetDrunkenstateByValue(), GetDrunkValue(), Object::GetGUID(), WorldPackets::Misc::CrossedInebriationThreshold::Guid, WorldPackets::Misc::CrossedInebriationThreshold::ItemID, m_drunkTimer, PLAYER_BYTES_3, PLAYER_BYTES_3_OFFSET_INEBRIATION, SendMessageToSet(), Object::SetByteValue(), WorldPackets::Misc::CrossedInebriationThreshold::Threshold, UpdateInvisibilityDrunkDetect(), and WorldPackets::Misc::CrossedInebriationThreshold::Write().

Referenced by Spell::EffectInebriate(), HandleSobering(), LoadFromDB(), and setDeathState().

◆ SetDungeonDifficulty()

void Player::SetDungeonDifficulty ( Difficulty  dungeon_difficulty)
inline

◆ SetEntryPoint()

void Player::SetEntryPoint ( )
11304{
11307
11308 if (!m_taxi.empty())
11309 {
11312
11315 }
11316 else
11317 {
11318 if (IsMounted())
11319 {
11321 if (!auras.empty())
11322 m_entryPointData.mountSpell = (*auras.begin())->GetId();
11323 }
11324 else
11326
11327 if (GetMap()->IsDungeon())
11328 {
11329 if (const GraveyardStruct* entry = sGraveyard->GetClosestGraveyard(this, GetTeamId()))
11330 m_entryPointData.joinPos = WorldLocation(entry->Map, entry->x, entry->y, entry->z, 0.0f);
11331 }
11332 else if (!GetMap()->IsBattlegroundOrArena())
11334 }
11335
11338}
bool IsDungeon() const
Definition Map.h:295
bool IsBattlegroundOrArena() const
Definition Map.h:303
bool empty() const
Definition PlayerTaxi.h:76
uint32 GetTaxiDestination() const
Definition PlayerTaxi.h:64
uint32 m_mapId
Definition Position.h:324

References EntryPointData::ClearTaxiPath(), PlayerTaxi::empty(), Unit::GetAuraEffectsByType(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), PlayerTaxi::GetTaxiDestination(), PlayerTaxi::GetTaxiSource(), GetTeamId(), Map::IsBattlegroundOrArena(), Map::IsDungeon(), Unit::IsMounted(), EntryPointData::joinPos, m_entryPointData, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, WorldLocation::m_mapId, m_taxi, MAPID_INVALID, EntryPointData::mountSpell, sGraveyard, SPELL_AURA_MOUNTED, and EntryPointData::taxiPath.

Referenced by misc_commandscript::HandleAppearCommand(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), and lfg::LFGMgr::TeleportPlayer().

◆ SetEquipmentSet()

void Player::SetEquipmentSet ( uint32  index,
EquipmentSet  eqset 
)
14625{
14626 if (eqset.Guid != 0)
14627 {
14628 bool found = false;
14629
14630 for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr)
14631 {
14632 if ((itr->second.Guid == eqset.Guid) && (itr->first == index))
14633 {
14634 found = true;
14635 break;
14636 }
14637 }
14638
14639 if (!found) // something wrong...
14640 {
14641 LOG_ERROR("entities.player", "Player {} tried to save equipment set {} (index {}), but that equipment set not found!", GetName(), eqset.Guid, index);
14642 return;
14643 }
14644 }
14645
14646 EquipmentSet& eqslot = m_EquipmentSets[index];
14647
14648 EquipmentSetUpdateState old_state = eqslot.state;
14649
14650 eqslot = eqset;
14651
14652 if (eqset.Guid == 0)
14653 {
14654 eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid();
14655
14657 data << uint32(index);
14658 data.appendPackGUID(eqslot.Guid);
14659 SendDirectMessage(&data);
14660 }
14661
14663}
EquipmentSetUpdateState
Definition Player.h:736
@ SMSG_EQUIPMENT_SET_SAVED
Definition Opcodes.h:341

References ByteBuffer::appendPackGUID(), EQUIPMENT_SET_CHANGED, EQUIPMENT_SET_NEW, WorldObject::GetName(), EquipmentSet::Guid, LOG_ERROR, m_EquipmentSets, SendDirectMessage(), SMSG_EQUIPMENT_SET_SAVED, sObjectMgr, and EquipmentSet::state.

Referenced by WorldSession::HandleEquipmentSetSave().

◆ SetExpectingChangeTransport()

void Player::SetExpectingChangeTransport ( bool  state)
inline

◆ SetFactionForRace()

void Player::SetFactionForRace ( uint8  race)
5869{
5870 m_team = TeamIdForRace(race);
5871
5872 sScriptMgr->OnPlayerUpdateFaction(this);
5873
5874 if (GetTeamId(true) != GetTeamId())
5875 return;
5876
5877 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
5878 SetFaction(rEntry ? rEntry->FactionID : 0);
5879}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
void SetFaction(uint32 faction)
Definition Unit.cpp:10107
Definition DBCStructure.h:679
uint32 FactionID
Definition DBCStructure.h:682

References ChrRacesEntry::FactionID, GetTeamId(), m_team, sChrRacesStore, Unit::SetFaction(), sScriptMgr, and TeamIdForRace().

Referenced by Create(), reset_commandscript::HandleResetStatsOrLevelHelper(), LoadFromDB(), InstanceScript::OnPlayerLeave(), Unit::RestoreFaction(), and SetGameMaster().

◆ SetFallInformation()

◆ SetFarSightDistance()

void Player::SetFarSightDistance ( float  radius)
16286{
16287 _farSightDistance = radius;
16288}

References _farSightDistance.

Referenced by AuraEffect::HandleFarSight().

◆ SetFreePrimaryProfessions()

void Player::SetFreePrimaryProfessions ( uint16  profs)
inline

◆ SetFreeTalentPoints()

void Player::SetFreeTalentPoints ( uint32  points)

◆ SetGameMaster()

void Player::SetGameMaster ( bool  on)
2205{
2206 if (on)
2207 {
2209 if (GetSession()->IsGMAccount())
2213
2214 if (Pet* pet = GetPet())
2215 {
2216 if (GetSession()->IsGMAccount())
2217 pet->SetFaction(FACTION_FRIENDLY);
2218 pet->getHostileRefMgr().setOnlineOfflineState(false);
2219 }
2221 {
2223 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
2224 }
2226
2229
2230 SetPhaseMask(uint32(PHASEMASK_ANYWHERE), false); // see and visible in all phases
2232 }
2233 else
2234 {
2235 // restore phase
2236 uint32 newPhase = GetPhaseByAuras();
2237
2238 if (!newPhase)
2239 newPhase = PHASEMASK_NORMAL;
2240
2241 SetPhaseMask(newPhase, false);
2242
2243 m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
2247
2248 if (Pet* pet = GetPet())
2249 {
2250 pet->SetFaction(GetFaction());
2251 pet->getHostileRefMgr().setOnlineOfflineState(true);
2252 }
2253
2254 // restore FFA PvP Server state
2255 if (sWorld->IsFFAPvPRealm())
2256 {
2258 {
2260 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, true);
2261 }
2262 }
2263 // restore FFA PvP area state, remove not allowed for GM mounts
2265
2268 }
2269
2271}
@ SEC_PLAYER
Definition Common.h:57
@ PHASEMASK_ANYWHERE
Definition Object.h:63
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1284
@ FACTION_FRIENDLY
Definition SharedDefines.h:212
@ UNIT_FLAG2_ALLOW_CHEAT_SPELLS
Definition UnitDefines.h:310
void ResetContestedPvP()
Definition Player.h:1865
void SetServerSideVisibilityDetect(ServerSideVisibilityType type, AccountTypes sec)
Definition Player.cpp:16278
void UpdateArea(uint32 newArea)
Definition PlayerUpdates.cpp:1215
uint32 GetFaction() const
Definition Unit.h:834
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19080
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10530
bool IsGMAccount(uint32 gmlevel)
Definition AccountMgr.cpp:317

References Unit::CombatStopWithPets(), FACTION_FRIENDLY, Unit::GetFaction(), Unit::getHostileRefMgr(), GetPet(), Unit::GetPhaseByAuras(), Unit::getRace(), GetSession(), Object::HasByteFlag(), m_areaUpdateId, m_ExtraFlags, PHASEMASK_ANYWHERE, PHASEMASK_NORMAL, PLAYER_EXTRA_GM_ON, PLAYER_FLAGS_GM, Object::RemoveByteFlag(), RemovePlayerFlag(), Unit::RemoveUnitFlag2(), ResetContestedPvP(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, Object::SetByteFlag(), Unit::SetFaction(), SetFactionForRace(), HostileRefMgr::setOnlineOfflineState(), Unit::SetPhaseMask(), SetPlayerFlag(), SetServerSideVisibilityDetect(), Unit::SetUnitFlag2(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG2_ALLOW_CHEAT_SPELLS, UpdateArea(), and UpdateObjectVisibility().

Referenced by gm_commandscript::HandleGMOffCommand(), gm_commandscript::HandleGMOnCommand(), and LoadFromDB().

◆ SetGlyph()

void Player::SetGlyph ( uint8  slot,
uint32  glyph,
bool  save 
)
inline
1755 {
1756 m_Glyphs[m_activeSpec][slot] = glyph;
1758
1759 if (save)
1760 SetNeedToSaveGlyphs(true);
1761 }
@ PLAYER_FIELD_GLYPHS_1
Definition UpdateFields.h:389

References m_activeSpec, m_Glyphs, PLAYER_FIELD_GLYPHS_1, SetNeedToSaveGlyphs(), and Unit::SetUInt32Value().

Referenced by _LoadGlyphAuras(), ActivateSpec(), Spell::EffectApplyGlyph(), and WorldSession::HandleRemoveGlyph().

◆ SetGlyphSlot()

void Player::SetGlyphSlot ( uint8  slot,
uint32  slottype 
)
inline

◆ SetGMChat()

void Player::SetGMChat ( bool  on)
inline
1164{ if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }

References m_ExtraFlags, and PLAYER_EXTRA_GM_CHAT.

Referenced by LoadFromDB().

◆ SetGMSpectator()

void Player::SetGMSpectator ( bool  on)
inline
1166{ if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_SPECTATOR; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_SPECTATOR; }

References m_ExtraFlags, and PLAYER_EXTRA_GM_SPECTATOR.

Referenced by gm_commandscript::HandleGMSpectatorCommand().

◆ SetGMVisible()

void Player::SetGMVisible ( bool  on)
2274{
2275 const uint32 VISUAL_AURA = 37800;
2276
2277 if (on)
2278 {
2279 RemoveAurasDueToSpell(VISUAL_AURA);
2280 m_ExtraFlags &= ~PLAYER_EXTRA_GM_INVISIBLE;
2282
2285 }
2286 else
2287 {
2288 AddAura(VISUAL_AURA, this);
2291 }
2292}
void SetServerSideVisibility(ServerSideVisibilityType type, AccountTypes sec)
Definition Player.cpp:16271

References Unit::AddAura(), Unit::CombatStopWithPets(), Unit::getHostileRefMgr(), GetSession(), m_ExtraFlags, PLAYER_EXTRA_GM_INVISIBLE, Unit::RemoveAurasDueToSpell(), SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, HostileRefMgr::setOnlineOfflineState(), and SetServerSideVisibility().

Referenced by gm_commandscript::HandleGMVisibleCommand(), and LoadFromDB().

◆ SetGracePeriod()

void Player::SetGracePeriod ( uint8  index,
uint32  period 
)
inline

◆ SetGrantableLevels()

void Player::SetGrantableLevels ( uint8  val)
inline

◆ SetGroup()

void Player::SetGroup ( Group group,
int8  subgroup = -1 
)
11574{
11575 if (!group)
11576 m_group.unlink();
11577 else
11578 {
11579 // never use SetGroup without a subgroup unless you specify nullptr for group
11580 ASSERT(subgroup >= 0);
11581 m_group.link(group, this);
11582 m_group.setSubGroup((uint8)subgroup);
11583 }
11584
11586}

References ASSERT, Reference< TO, FROM >::link(), m_group, GroupReference::setSubGroup(), Reference< TO, FROM >::unlink(), and UpdateObjectVisibility().

Referenced by _LoadGroup(), Group::AddMember(), Group::Disband(), and Group::RemoveMember().

◆ SetGroupInvite()

void Player::SetGroupInvite ( Group group)
inline

◆ SetGroupUpdateFlag()

◆ SetGuildIdInvited()

void Player::SetGuildIdInvited ( uint32  GuildId)
inline

◆ SetHas310Flyer()

void Player::SetHas310Flyer ( bool  on)
inline
1173{ if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }

References m_ExtraFlags, and PLAYER_EXTRA_HAS_310_FLYER.

Referenced by _addSpell(), and Has310Flyer().

◆ SetHasDelayedTeleport()

void Player::SetHasDelayedTeleport ( bool  setting)
inlineprivate
2963{ m_bHasDelayedTeleport = setting; }

References m_bHasDelayedTeleport.

Referenced by TeleportTo(), and Update().

◆ SetHomebind()

void Player::SetHomebind ( WorldLocation const &  loc,
uint32  areaId 
)
4903{
4904 loc.GetPosition(m_homebindX, m_homebindY, m_homebindZ);
4905 m_homebindMapId = loc.GetMapId();
4906 m_homebindAreaId = areaId;
4907
4908 // update sql homebind
4910 stmt->SetData(0, m_homebindMapId);
4911 stmt->SetData(1, m_homebindAreaId);
4912 stmt->SetData (2, m_homebindX);
4913 stmt->SetData (3, m_homebindY);
4914 stmt->SetData (4, m_homebindZ);
4915 stmt->SetData(5, GetGUID().GetCounter());
4916 CharacterDatabase.Execute(stmt);
4917}
@ CHAR_UPD_PLAYER_HOMEBIND
Definition CharacterDatabase.h:243

References CHAR_UPD_PLAYER_HOMEBIND, CharacterDatabase, Object::GetGUID(), WorldLocation::GetMapId(), Position::GetPosition(), m_homebindAreaId, m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, and PreparedStatementBase::SetData().

Referenced by Spell::EffectBind().

◆ SetHonorPoints()

void Player::SetHonorPoints ( uint32  value)
6268{
6269 if (value > sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS))
6270 {
6271 if (int32 copperPerPoint = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT))
6272 {
6273 // Only convert points on login, not when awarded honor points.
6274 if (isBeingLoaded())
6275 {
6276 int32 excessPoints = value - sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6277 ModifyMoney(excessPoints * copperPerPoint);
6278 }
6279 }
6280
6281 value = sWorld->getIntConfig(CONFIG_MAX_HONOR_POINTS);
6282 }
6284 if (value)
6286}
@ ITEM_HONOR_POINTS_ID
Definition Player.h:955
@ CONFIG_MAX_HONOR_POINTS
Definition WorldConfig.h:195
@ CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT
Definition WorldConfig.h:196

References AddKnownCurrency(), CONFIG_MAX_HONOR_POINTS, CONFIG_MAX_HONOR_POINTS_MONEY_PER_POINT, isBeingLoaded(), ITEM_HONOR_POINTS_ID, ModifyMoney(), PLAYER_FIELD_HONOR_CURRENCY, Unit::SetUInt32Value(), and sWorld.

Referenced by Create(), reset_commandscript::HandleResetHonorCommand(), LoadFromDB(), and ModifyHonorPoints().

◆ SetInArenaTeam()

void Player::SetInArenaTeam ( uint32  ArenaTeamId,
uint8  slot,
uint8  type 
)
inline
1903 {
1904 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
1906 }

References ARENA_TEAM_ID, ARENA_TEAM_TYPE, and SetArenaTeamInfoField().

Referenced by ArenaTeam::AddMember().

◆ SetInGameTime()

void Player::SetInGameTime ( uint32  time)
inline

◆ SetInGuild()

void Player::SetInGuild ( uint32  GuildId)
inline

◆ SetInviteForBattlegroundQueueType()

void Player::SetInviteForBattlegroundQueueType ( BattlegroundQueueTypeId  bgQueueTypeId,
uint32  instanceId 
)
12332{
12333 for (uint8 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
12334 if (_BgBattlegroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
12335 _BgBattlegroundQueueID[i].invitedToInstance = instanceId;
12336}

References _BgBattlegroundQueueID, and PLAYER_MAX_BATTLEGROUND_QUEUES.

Referenced by BattlegroundQueue::InviteGroupToBG().

◆ SetInWater()

void Player::SetInWater ( bool  apply)
2162{
2163 if (m_isInWater == apply)
2164 return;
2165
2166 //define player in water by opcodes
2167 //move player's guid into HateOfflineList of those mobs
2168 //which can't swim and move guid back into ThreatList when
2169 //on surface.
2170 //TODO: exist also swimming mobs, and function must be symmetric to enter/leave water
2172
2173 // remove auras that need water/land
2175
2177
2178 if (InstanceScript* instance = GetInstanceScript())
2179 instance->OnPlayerInWaterStateUpdate(this, apply);
2180}
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void updateThreatTables()
Definition HostileRefMgr.cpp:111

References AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, Unit::getHostileRefMgr(), WorldObject::GetInstanceScript(), m_isInWater, Unit::RemoveAurasWithInterruptFlags(), and HostileRefMgr::updateThreatTables().

Referenced by WorldSession::ProcessMovementInfo().

◆ SetIsSpectator()

void Player::SetIsSpectator ( bool  on)
15474{
15475 if (on)
15476 {
15480 //SetFaction(1100);
15483 {
15485 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
15486 }
15488 SetDisplayId(23691);
15489 }
15490 else
15491 {
15493 if (IsSpectator())
15495 m_ExtraFlags &= ~PLAYER_EXTRA_SPECTATOR_ON;
15498
15499 if (!IsGameMaster())
15500 {
15501 //SetFactionForRace(getRace());
15502
15503 // restore FFA PvP Server state
15504 // Xinef: it will be removed if necessery in UpdateArea called in WorldPortOpcode
15505 if (sWorld->IsFFAPvPRealm())
15506 {
15508 {
15510 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, true);
15511
15512 }
15513 }
15514 }
15515 }
15516}
#define SPECTATOR_SPELL_SPEED
Definition ArenaSpectator.h:39
void RestoreDisplayId()
Definition Unit.cpp:16801

References Unit::AddAura(), Unit::AddUnitState(), Unit::ClearUnitState(), Object::HasByteFlag(), IsGameMaster(), IsSpectator(), m_ExtraFlags, PLAYER_EXTRA_SPECTATOR_ON, Unit::RemoveAurasDueToSpell(), Object::RemoveByteFlag(), Unit::RemoveUnitFlag(), ResetContestedPvP(), Unit::RestoreDisplayId(), Object::SetByteFlag(), Unit::SetDisplayId(), Unit::SetUnitFlag(), SPECTATOR_SPELL_SPEED, sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, and UNIT_STATE_ISOLATED.

Referenced by WorldSession::HandleMoveWorldportAck(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetLastPetNumber()

void Player::SetLastPetNumber ( uint32  petnumber)
inline
2462{ m_lastpetnumber = petnumber; }

References m_lastpetnumber.

Referenced by Pet::LoadPetFromDB().

◆ SetLastPetSpell()

void Player::SetLastPetSpell ( uint32  petspell)
inline
2464{ m_oldpetspell = petspell; }

References m_oldpetspell.

Referenced by Pet::LoadPetFromDB(), and UnsummonPetTemporaryIfAny().

◆ SetLastPotionId()

void Player::SetLastPotionId ( uint32  item_id)
inline
1808{ m_lastPotionId = item_id; }

References m_lastPotionId.

Referenced by Spell::SendSpellCooldown(), and UpdatePotionCooldown().

◆ SetLastUsedRune()

void Player::SetLastUsedRune ( RuneType  type)
inline
2517{ m_runes->lastUsedRune = type; }

References Runes::lastUsedRune, and m_runes.

Referenced by Spell::TakeRunePower().

◆ SetLootGUID()

void Player::SetLootGUID ( ObjectGuid  guid)
inline
1994{ m_lootGuid = guid; }

References m_lootGuid.

Referenced by WorldSession::DoLootRelease(), and SendLoot().

◆ SetMap()

void Player::SetMap ( Map map)
overridevirtual

Reimplemented from WorldObject.

14794{
14795 Unit::SetMap(map);
14796 m_mapRef.link(map, this);
14797}
virtual void SetMap(Map *map)
Definition Object.cpp:2115

References Reference< TO, FROM >::link(), m_mapRef, and WorldObject::SetMap().

Referenced by Map::AddPlayerToMap(), Create(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleSetRaidDifficultyOpcode(), and LoadFromDB().

◆ SetMapChangeOrderCounter()

void Player::SetMapChangeOrderCounter ( )
inline

◆ SetMoney()

void Player::SetMoney ( uint32  value)
inline

◆ SetMonthlyQuestStatus()

void Player::SetMonthlyQuestStatus ( uint32  quest_id)
12199{
12200 m_monthlyquests.insert(quest_id);
12201 m_MonthlyQuestChanged = true;
12202}

References m_MonthlyQuestChanged, and m_monthlyquests.

Referenced by RewardQuest().

◆ SetMountBlockId()

void Player::SetMountBlockId ( uint32  mount)
inline

◆ SetMovement()

void Player::SetMovement ( PlayerMovementType  pType)
4413{
4414 WorldPacket data;
4415 const PackedGuid& guid = GetPackGUID();
4416 switch (pType)
4417 {
4418 case MOVE_WATER_WALK:
4419 data.Initialize(SMSG_MOVE_WATER_WALK, guid.size() + 4);
4420 break;
4421 case MOVE_LAND_WALK:
4422 data.Initialize(SMSG_MOVE_LAND_WALK, guid.size() + 4);
4423 break;
4424 default:
4425 LOG_ERROR("entities.player", "Player::SetMovement: Unsupported move type ({}), data not sent to client.", pType);
4426 return;
4427 }
4428 data << guid;
4429 data << GetSession()->GetOrderCounter(); // movement counter
4430 SendDirectMessage(&data);
4432}
Definition ObjectGuid.h:263
@ SMSG_MOVE_LAND_WALK
Definition Opcodes.h:253

References WorldSession::GetOrderCounter(), Object::GetPackGUID(), GetSession(), WorldSession::IncrementOrderCounter(), WorldPacket::Initialize(), LOG_ERROR, MOVE_LAND_WALK, MOVE_WATER_WALK, SendDirectMessage(), PackedGuid::size(), SMSG_MOVE_LAND_WALK, and SMSG_MOVE_WATER_WALK.

Referenced by BuildPlayerRepop(), WorldSession::HandlePlayerLoginFromDB(), cheat_commandscript::HandleWaterWalkCheatCommand(), and ResurrectPlayer().

◆ SetMover()

void Player::SetMover ( Unit target)
12944{
12945 if (this != target && target->m_movedByPlayer && target->m_movedByPlayer != target && target->m_movedByPlayer != this)
12946 {
12947 LOG_INFO("misc", "Player::SetMover (A1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12948 LOG_INFO("misc", "Player::SetMover (A2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12949 LOG_INFO("misc", "Player::SetMover (A3) - {}, {}, {}, {}, {}, {}, {}, {}", target->m_movedByPlayer->GetGUID().ToString(), target->m_movedByPlayer->GetMapId(), target->m_movedByPlayer->GetInstanceId(), target->m_movedByPlayer->FindMap()->GetId(), target->m_movedByPlayer->IsInWorld() ? 1 : 0, target->m_movedByPlayer->IsDuringRemoveFromWorld() ? 1 : 0, target->m_movedByPlayer->ToPlayer()->IsBeingTeleported() ? 1 : 0, target->m_movedByPlayer->isBeingLoaded() ? 1 : 0);
12950 }
12951 if (this != target && (!target->IsInWorld() || target->IsDuringRemoveFromWorld() || GetMapId() != target->GetMapId() || GetInstanceId() != target->GetInstanceId()))
12952 {
12953 LOG_INFO("misc", "Player::SetMover (B1) - {}, {}, {}, {}, {}, {}, {}, {}", GetGUID().ToString(), GetMapId(), GetInstanceId(), FindMap()->GetId(), IsInWorld() ? 1 : 0, IsDuringRemoveFromWorld() ? 1 : 0, IsBeingTeleported() ? 1 : 0, isBeingLoaded() ? 1 : 0);
12954 LOG_INFO("misc", "Player::SetMover (B2) - {}, {}, {}, {}, {}, {}, {}, {}", target->GetGUID().ToString(), target->GetMapId(), target->GetInstanceId(), target->FindMap()->GetId(), target->IsInWorld() ? 1 : 0, target->IsDuringRemoveFromWorld() ? 1 : 0, (target->ToPlayer() && target->ToPlayer()->IsBeingTeleported() ? 1 : 0), target->isBeingLoaded() ? 1 : 0);
12955 }
12956 m_mover->m_movedByPlayer = nullptr;
12957 if (m_mover->IsCreature())
12959
12960 m_mover = target;
12961 m_mover->m_movedByPlayer = this;
12962 if (m_mover->IsCreature())
12964}
void Initialize()
Definition MotionMaster.cpp:74
bool IsDuringRemoveFromWorld() const
Definition Unit.h:688

References WorldObject::FindMap(), Object::GetGUID(), Object::GetGUID(), Map::GetId(), WorldObject::GetInstanceId(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), MotionMaster::Initialize(), Unit::isBeingLoaded(), isBeingLoaded(), IsBeingTeleported(), Object::IsCreature(), Unit::IsDuringRemoveFromWorld(), Object::IsInWorld(), LOG_INFO, Unit::m_movedByPlayer, m_mover, Object::ToPlayer(), ObjectGuid::ToString(), and Position::ToString().

Referenced by SendInitialPacketsBeforeAddToMap(), and SetClientControl().

◆ SetMustDelayTeleport()

void Player::SetMustDelayTeleport ( bool  setting)
inlineprivate
2961{ m_bMustDelayTeleport = setting; }

References m_bMustDelayTeleport.

Referenced by RewardQuest(), and Update().

◆ SetNeedToSaveGlyphs()

void Player::SetNeedToSaveGlyphs ( bool  val)
inline
2602{ m_NeedToSaveGlyphs = val; }

References m_NeedToSaveGlyphs.

Referenced by _SaveGlyphs(), and SetGlyph().

◆ SetNeedZoneUpdate()

void Player::SetNeedZoneUpdate ( bool  needUpdate)
inline
1855{ m_needZoneUpdate = needUpdate; }

References m_needZoneUpdate.

Referenced by WorldSession::HandleZoneUpdateOpcode().

◆ SetObjectScale()

void Player::SetObjectScale ( float  scale)
inlineoverridevirtual

Reimplemented from Object.

1086 {
1087 Unit::SetObjectScale(scale);
1090 }
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:44
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:45
@ UNIT_FIELD_COMBATREACH
Definition UpdateFields.h:123
@ UNIT_FIELD_BOUNDINGRADIUS
Definition UpdateFields.h:122
virtual void SetObjectScale(float scale)
Definition Object.h:120

References DEFAULT_COMBAT_REACH, DEFAULT_WORLD_OBJECT_SIZE, Object::SetFloatValue(), Object::SetObjectScale(), UNIT_FIELD_BOUNDINGRADIUS, and UNIT_FIELD_COMBATREACH.

Referenced by Create(), InitStatsForLevel(), and LoadFromDB().

◆ SetOriginalGroup()

void Player::SetOriginalGroup ( Group group,
int8  subgroup = -1 
)
13160{
13161 if (!group)
13163 else
13164 {
13165 // never use SetOriginalGroup without a subgroup unless you specify nullptr for group
13166 ASSERT(subgroup >= 0);
13167 m_originalGroup.link(group, this);
13169 }
13170}

References ASSERT, Reference< TO, FROM >::link(), m_originalGroup, GroupReference::setSubGroup(), and Reference< TO, FROM >::unlink().

Referenced by Group::AddMember(), Group::Disband(), RemoveFromBattlegroundOrBattlefieldRaid(), Group::RemoveMember(), and SetBattlegroundOrBattlefieldRaid().

◆ SetPassOnGroupLoot()

void Player::SetPassOnGroupLoot ( bool  bPassOnGroupLoot)
inline
2492{ m_bPassOnGroupLoot = bPassOnGroupLoot; }

References m_bPassOnGroupLoot.

Referenced by WorldSession::HandleOptOutOfLootOpcode().

◆ SetPendingBind()

void Player::SetPendingBind ( uint32  instanceId,
uint32  bindTimer 
)
inline

◆ SetPendingFlightChange()

void Player::SetPendingFlightChange ( uint32  counter)
inline

◆ SetPendingSpectatorForBG()

void Player::SetPendingSpectatorForBG ( uint32  bgInstanceId)
inline

◆ SetPendingSpectatorInviteInstanceId()

void Player::SetPendingSpectatorInviteInstanceId ( uint32  bgInstanceId)
inline

◆ SetPlayerFlag()

◆ SetPvP()

void Player::SetPvP ( bool  state)
inline
1846 {
1847 Unit::SetPvP(state);
1848 if (!m_Controlled.empty())
1849 for (auto& itr : m_Controlled)
1850 itr->SetPvP(state);
1851 }
void SetPvP(bool state)
Definition Player.h:1845
ControlSet m_Controlled
Definition Unit.h:2032
void SetPvP(bool state)
Definition Unit.h:1024

References Unit::m_Controlled, and Unit::SetPvP().

Referenced by UpdatePvP().

◆ SetPvPDeath()

void Player::SetPvPDeath ( bool  on)
inline
1174{ if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }

References m_ExtraFlags, and PLAYER_EXTRA_PVP_DEATH.

Referenced by CreateCorpse().

◆ SetQuestSlot()

◆ SetQuestSlotCounter()

void Player::SetQuestSlotCounter ( uint16  slot,
uint8  counter,
uint16  count 
)
inline

◆ SetQuestSlotState()

void Player::SetQuestSlotState ( uint16  slot,
uint32  state 
)
inline

◆ SetQuestSlotTimer()

void Player::SetQuestSlotTimer ( uint16  slot,
uint32  timer 
)
inline

◆ SetQuestStatus()

void Player::SetQuestStatus ( uint32  questId,
QuestStatus  status,
bool  update = true 
)
1480{
1481 if (Quest const* quest = sObjectMgr->GetQuestTemplate(questId))
1482 {
1483 m_QuestStatus[questId].Status = status;
1484
1485 if (quest->GetQuestMethod() && !quest->IsAutoComplete())
1486 {
1487 m_QuestStatusSave[questId] = true;
1488 }
1489 }
1490
1491 if (update)
1492 SendQuestUpdate(questId);
1493}

References m_QuestStatus, m_QuestStatusSave, SendQuestUpdate(), and sObjectMgr.

Referenced by CompleteQuest(), FailQuest(), IncompleteQuest(), and npc_finklestein::npc_finklesteinAI::RightClickCauldron().

◆ SetRaidDifficulty()

void Player::SetRaidDifficulty ( Difficulty  raid_difficulty)
inline

◆ SetRandomWinner()

void Player::SetRandomWinner ( bool  isWinner)
15824{
15825 m_IsBGRandomWinner = isWinner;
15827 {
15829 stmt->SetData(0, GetGUID().GetCounter());
15830 CharacterDatabase.Execute(stmt);
15831 }
15832}
@ CHAR_INS_BATTLEGROUND_RANDOM
Definition CharacterDatabase.h:64

References CHAR_INS_BATTLEGROUND_RANDOM, CharacterDatabase, Object::GetGUID(), m_IsBGRandomWinner, and PreparedStatementBase::SetData().

◆ SetRank()

void Player::SetRank ( uint8  rankId)
inline

◆ setRegenTimerCount()

void Player::setRegenTimerCount ( uint32  time)
inline
1600{m_regenTimerCount = time;}

References m_regenTimerCount.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetRegularAttackTime()

void Player::SetRegularAttackTime ( )
5313{
5314 for (uint8 i = 0; i < MAX_ATTACK; ++i)
5315 {
5316 Item* tmpitem = GetWeaponForAttack(WeaponAttackType(i), true);
5317 if (tmpitem && !tmpitem->IsBroken())
5318 {
5319 ItemTemplate const* proto = tmpitem->GetTemplate();
5320 if (proto->Delay)
5322 }
5323 else
5324 SetAttackTime(WeaponAttackType(i), BASE_ATTACK_TIME); // If there is no weapon reset attack time to base (might have been changed from forms)
5325 }
5326}

References BASE_ATTACK_TIME, ItemTemplate::Delay, Item::GetTemplate(), GetWeaponForAttack(), Item::IsBroken(), MAX_ATTACK, and Unit::SetAttackTime().

Referenced by InitDataForForm().

◆ SetReputation()

void Player::SetReputation ( uint32  factionentry,
float  value 
)
15452{
15453 GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
15454}
bool SetReputation(FactionEntry const *factionEntry, float standing)
Definition ReputationMgr.h:113

References GetReputationMgr(), ReputationMgr::SetReputation(), and sFactionStore.

◆ SetRestBonus()

void Player::SetRestBonus ( float  restBonusNew)
10230{
10231 // Prevent resting on max level
10232 if (GetLevel() >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
10233 restBonusNew = 0;
10234
10235 if (restBonusNew < 0)
10236 restBonusNew = 0;
10237
10238 // Fetch rest bonus multiplier from cached configuration
10239 float restBonusMultiplier = sWorld->getRate(RATE_REST_MAX_BONUS);
10240
10241 // Calculate rest bonus max using the multiplier
10242 float restBonusMax = (float)GetUInt32Value(PLAYER_NEXT_LEVEL_XP) * restBonusMultiplier / 2;
10243
10244 if (restBonusNew > restBonusMax)
10245 _restBonus = restBonusMax;
10246 else
10247 _restBonus = restBonusNew;
10248 // update data for client
10249 if ((GetsRecruitAFriendBonus(true) && (GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0)))
10251 else
10252 {
10253 if (_restBonus > 10)
10255 else if (_restBonus <= 1)
10257 }
10258
10259 //RestTickUpdate
10261}
@ REST_STATE_RESTED
Definition Player.h:979
@ PLAYER_REST_STATE_EXPERIENCE
Definition UpdateFields.h:358
@ RATE_REST_MAX_BONUS
Definition WorldConfig.h:465

References _restBonus, CONFIG_MAX_PLAYER_LEVEL, Unit::GetLevel(), GetSession(), GetsRecruitAFriendBonus(), Object::GetUInt32Value(), PLAYER_BYTES_2, PLAYER_NEXT_LEVEL_XP, PLAYER_REST_STATE_EXPERIENCE, RATE_REST_MAX_BONUS, REST_STATE_NOT_RAF_LINKED, REST_STATE_RAF_LINKED, REST_STATE_RESTED, Object::SetByteValue(), Unit::SetUInt32Value(), and sWorld.

Referenced by GetXPRestBonus(), LoadFromDB(), and Update().

◆ SetRestFlag()

void Player::SetRestFlag ( RestFlag  restFlag,
uint32  triggerId = 0 
)
16166{
16167 uint32 oldRestMask = _restFlagMask;
16168 _restFlagMask |= restFlag;
16169
16170 if (!oldRestMask && _restFlagMask) // only set flag/time on the first rest state
16171 {
16172 _restTime = GameTime::GetGameTime().count();
16174 }
16175
16176 if (triggerId)
16177 _innTriggerId = triggerId;
16178}

References _innTriggerId, _restFlagMask, _restTime, GameTime::GetGameTime(), PLAYER_FLAGS_RESTING, and SetPlayerFlag().

Referenced by WorldSession::HandleAreaTriggerOpcode(), LoadFromDB(), UpdateArea(), and UpdateZone().

◆ SetRestState()

void Player::SetRestState ( uint32  triggerId)

◆ setResurrectRequestData()

void Player::setResurrectRequestData ( ObjectGuid  guid,
uint32  mapId,
float  X,
float  Y,
float  Z,
uint32  health,
uint32  mana 
)
inline

◆ SetRewardedQuest()

void Player::SetRewardedQuest ( uint32  quest_id)
881{
882 m_RewardedQuests.insert(quest_id);
883 m_RewardedQuestsSave[quest_id] = true;
884}

References m_RewardedQuests, and m_RewardedQuestsSave.

Referenced by Spell::EffectQuestComplete(), and RewardQuest().

◆ SetRuneConvertAura()

void Player::SetRuneConvertAura ( uint8  index,
AuraEffect const *  aura 
)
inline

◆ SetRuneCooldown()

void Player::SetRuneCooldown ( uint8  index,
uint32  cooldown 
)
inline

◆ setRuneWeaponGUID()

void Player::setRuneWeaponGUID ( ObjectGuid  guid)
inline
2592{ m_drwGUID = guid; };

References m_drwGUID.

◆ SetSaveTimer()

void Player::SetSaveTimer ( uint32  timer)
inline
2361{ m_nextSave = timer; }

References m_nextSave.

◆ SetSeasonalQuestStatus()

void Player::SetSeasonalQuestStatus ( uint32  quest_id)
12189{
12190 Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id);
12191 if (!quest)
12192 return;
12193
12194 m_seasonalquests[quest->GetEventIdForQuest()].insert(quest_id);
12196}
uint16 GetEventIdForQuest() const
Definition QuestDef.h:332

References Quest::GetEventIdForQuest(), m_SeasonalQuestChanged, m_seasonalquests, and sObjectMgr.

Referenced by RewardQuest().

◆ SetSeer()

void Player::SetSeer ( WorldObject target)
inline
2353{ m_seer = target; }

References m_seer.

Referenced by WorldSession::HandleFarSightOpcode(), and SetViewpoint().

◆ SetSelection()

void Player::SetSelection ( ObjectGuid  guid)

Used for serverside target changes, does not apply to players.

11566{
11568
11571}
void SendCommand_GUID(T *o, ObjectGuid targetGUID, const char *prefix, ObjectGuid t)
Definition ArenaSpectator.h:71

References WorldObject::FindMap(), Object::GetGUID(), NeedSendSpectatorData(), ArenaSpectator::SendCommand_GUID(), Object::SetGuidValue(), and UNIT_FIELD_TARGET.

Referenced by WorldSession::HandleSetSelectionOpcode(), and TeleportTo().

◆ SetSemaphoreTeleportFar()

void Player::SetSemaphoreTeleportFar ( time_t  tm)
inline

◆ SetSemaphoreTeleportNear()

void Player::SetSemaphoreTeleportNear ( time_t  tm)
inline

◆ SetServerSideVisibility()

void Player::SetServerSideVisibility ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16272{
16273 sScriptMgr->OnPlayerSetServerSideVisibility(this, type, sec);
16274
16276}
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:395
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:613

References WorldObject::m_serverSideVisibility, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

Referenced by SetGMVisible().

◆ SetServerSideVisibilityDetect()

void Player::SetServerSideVisibilityDetect ( ServerSideVisibilityType  type,
AccountTypes  sec 
)
16279{
16280 sScriptMgr->OnPlayerSetServerSideVisibilityDetect(this, type, sec);
16281
16283}
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibilityDetect
Definition Object.h:614

References WorldObject::m_serverSideVisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and sScriptMgr.

Referenced by SetGameMaster().

◆ SetSession()

void Player::SetSession ( WorldSession sess)
inline
1999{ m_session = sess; }

References m_session.

Referenced by WorldSession::HandlePlayerLoginOpcode().

◆ SetSheath()

void Player::SetSheath ( SheathState  sheathed)
overridevirtual

Reimplemented from Unit.

99{
100 switch (sheathed)
101 {
102 case SHEATH_STATE_UNARMED: // no prepared weapon
103 SetVirtualItemSlot(0, nullptr);
104 SetVirtualItemSlot(1, nullptr);
105 SetVirtualItemSlot(2, nullptr);
106 break;
107 case SHEATH_STATE_MELEE: // prepared melee weapon
110 SetVirtualItemSlot(2, nullptr);
111 break;
112 case SHEATH_STATE_RANGED: // prepared ranged weapon
113 SetVirtualItemSlot(0, nullptr);
114 SetVirtualItemSlot(1, nullptr);
116 break;
117 default:
118 SetVirtualItemSlot(0, nullptr);
119 SetVirtualItemSlot(1, nullptr);
120 SetVirtualItemSlot(2, nullptr);
121 break;
122 }
123 Unit::SetSheath(sheathed); // this must visualize Sheath changing for other players...
124}
@ SHEATH_STATE_UNARMED
Definition UnitDefines.h:126
@ SHEATH_STATE_MELEE
Definition UnitDefines.h:127
@ SHEATH_STATE_RANGED
Definition UnitDefines.h:128
void SetVirtualItemSlot(uint8 i, Item *item)
Definition PlayerStorage.cpp:78
virtual void SetSheath(SheathState sheathed)
Definition Unit.h:1732

References BASE_ATTACK, GetWeaponForAttack(), OFF_ATTACK, RANGED_ATTACK, Unit::SetSheath(), SetVirtualItemSlot(), SHEATH_STATE_MELEE, SHEATH_STATE_RANGED, and SHEATH_STATE_UNARMED.

Referenced by WorldSession::HandleSetSheathedOpcode().

◆ SetShowDKPet()

void Player::SetShowDKPet ( bool  on)
inline

◆ SetSkill()

void Player::SetSkill ( uint16  id,
uint16  step,
uint16  currVal,
uint16  maxVal 
)
5349{
5350 if (!id)
5351 return;
5352
5353 uint16 currVal;
5354 SkillStatusMap::iterator itr = mSkillStatus.find(id);
5355
5356 //has skill
5357 if (itr != mSkillStatus.end() && itr->second.uState != SKILL_DELETED)
5358 {
5359 currVal = SKILL_VALUE(GetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos)));
5360 if (newVal)
5361 {
5362 // if skill value is going down, update enchantments before setting the new value
5363 if (newVal < currVal)
5364 UpdateSkillEnchantments(id, currVal, newVal);
5365 // update step
5366 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), MAKE_PAIR32(id, step));
5367 // update value
5368 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), MAKE_SKILL_VALUE(newVal, maxVal));
5369 if (itr->second.uState != SKILL_NEW)
5370 itr->second.uState = SKILL_CHANGED;
5371 learnSkillRewardedSpells(id, newVal);
5372 // if skill value is going up, update enchantments after setting the new value
5373 if (newVal > currVal)
5374 UpdateSkillEnchantments(id, currVal, newVal);
5377 }
5378 else //remove
5379 {
5380 //remove enchantments needing this skill
5381 UpdateSkillEnchantments(id, currVal, 0);
5382 // clear skill fields
5383 SetUInt32Value(PLAYER_SKILL_INDEX(itr->second.pos), 0);
5384 SetUInt32Value(PLAYER_SKILL_VALUE_INDEX(itr->second.pos), 0);
5385 SetUInt32Value(PLAYER_SKILL_BONUS_INDEX(itr->second.pos), 0);
5386
5387 // mark as deleted or simply remove from map if not saved yet
5388 if (itr->second.uState != SKILL_NEW)
5389 itr->second.uState = SKILL_DELETED;
5390 else
5391 mSkillStatus.erase(itr);
5392
5393 // remove all spells that related to this skill
5395 removeSpell(sSpellMgr->GetFirstSpellInChain(pAbility->Spell), SPEC_MASK_ALL, false);
5396 }
5397 }
5398 else if (newVal) //add
5399 {
5400 currVal = 0;
5401 for (int i = 0; i < PLAYER_MAX_SKILLS; ++i)
5403 {
5404 SkillLineEntry const* pSkill = sSkillLineStore.LookupEntry(id);
5405 if (!pSkill)
5406 {
5407 LOG_ERROR("entities.player", "Skill not found in SkillLineStore: skill #{}", id);
5408 return;
5409 }
5410
5413 UpdateSkillEnchantments(id, currVal, newVal);
5414
5415 // insert new entry or update if not deleted old entry yet
5416 if (itr != mSkillStatus.end())
5417 {
5418 itr->second.pos = i;
5419 itr->second.uState = SKILL_CHANGED;
5420 }
5421 else
5422 mSkillStatus.insert(SkillStatusMap::value_type(id, SkillStatusData(i, SKILL_NEW)));
5423
5424 // apply skill bonuses
5426
5427 // temporary bonuses
5429 for (AuraEffectList::const_iterator j = mModSkill.begin(); j != mModSkill.end(); ++j)
5430 if ((*j)->GetMiscValue() == int32(id))
5431 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5432
5433 // permanent bonuses
5435 for (AuraEffectList::const_iterator j = mModSkillTalent.begin(); j != mModSkillTalent.end(); ++j)
5436 if ((*j)->GetMiscValue() == int32(id))
5437 (*j)->HandleEffect(this, AURA_EFFECT_HANDLE_SKILL, true);
5438
5439 // Learn all spells for skill
5440 learnSkillRewardedSpells(id, newVal);
5443 return;
5444 }
5445 }
5446}
@ ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL
Definition DBCEnums.h:125
@ ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL
Definition DBCEnums.h:154
@ SPELL_AURA_MOD_SKILL
Definition SpellAuraDefines.h:93
@ SPELL_AURA_MOD_SKILL_TALENT
Definition SpellAuraDefines.h:161
@ AURA_EFFECT_HANDLE_SKILL
Definition SpellAuraDefines.h:47
void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value)
Definition PlayerStorage.cpp:4687

References ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, AURA_EFFECT_HANDLE_SKILL, Unit::GetAuraEffectsByType(), GetSkillLineAbilitiesBySkillLine(), Object::GetUInt32Value(), learnSkillRewardedSpells(), LOG_ERROR, MAKE_PAIR32(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_MAX_SKILLS, PLAYER_SKILL_BONUS_INDEX, PLAYER_SKILL_INDEX, PLAYER_SKILL_VALUE_INDEX, removeSpell(), Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_NEW, SKILL_VALUE, SPEC_MASK_ALL, SPELL_AURA_MOD_SKILL, SPELL_AURA_MOD_SKILL_TALENT, sSkillLineStore, sSpellMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by _addSpell(), Spell::EffectLearnSkill(), learn_commandscript::HandleLearnAllLangCommand(), learn_commandscript::HandleLearnAllRecipesCommand(), misc_commandscript::HandleSetSkillCommand(), WorldSession::HandleUnlearnSkillOpcode(), LearnDefaultSkill(), and removeSpell().

◆ SetSpecsCount()

void Player::SetSpecsCount ( uint8  count)
inline
1740{ m_specsCount = count; }

References m_specsCount.

Referenced by UpdateSpecCount().

◆ SetSpellModTakingSpell()

void Player::SetSpellModTakingSpell ( Spell spell,
bool  apply 
)
10108{
10109 if (apply && m_spellModTakingSpell)
10110 {
10111 LOG_INFO("misc", "Player::SetSpellModTakingSpell (A1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10112 return;
10113 //ASSERT(m_spellModTakingSpell == nullptr);
10114 }
10115 else if (!apply)
10116 {
10118 LOG_INFO("misc", "Player::SetSpellModTakingSpell (B1) - {}", spell->m_spellInfo->Id);
10119 else if (m_spellModTakingSpell != spell)
10120 {
10121 LOG_INFO("misc", "Player::SetSpellModTakingSpell (C1) - {}, {}", spell->m_spellInfo->Id, m_spellModTakingSpell->m_spellInfo->Id);
10122 return;
10123 }
10124 //ASSERT(m_spellModTakingSpell && m_spellModTakingSpell == spell);
10125 }
10126
10127 m_spellModTakingSpell = apply ? spell : nullptr;
10128}

References SpellInfo::Id, LOG_INFO, Spell::m_spellInfo, and m_spellModTakingSpell.

Referenced by Spell::_cast(), Spell::cast(), Spell::handle_delayed(), Unit::HandleDummyAuraProc(), and Aura::UpdateOwner().

◆ SetSummonAsSpectator()

void Player::SetSummonAsSpectator ( bool  on)
inline

◆ SetSummonPoint()

void Player::SetSummonPoint ( uint32  mapid,
float  x,
float  y,
float  z,
uint32  delay = 0,
bool  asSpectator = false 
)
16346{
16347 m_summon_expire = GameTime::GetGameTime().count() + (delay ? delay : MAX_PLAYER_SUMMON_DELAY);
16348 m_summon_mapid = mapid;
16349 m_summon_x = x;
16350 m_summon_y = y;
16351 m_summon_z = z;
16352 m_summon_asSpectator = asSpectator;
16353}
#define MAX_PLAYER_SUMMON_DELAY
Definition Player.h:924

References GameTime::GetGameTime(), m_summon_asSpectator, m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, and MAX_PLAYER_SUMMON_DELAY.

Referenced by Spell::EffectSummonPlayer(), and Spell::EffectSummonRaFFriend().

◆ SetTarget()

void Player::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
inlineoverridevirtual

Implements Unit.

1633{ }

◆ SetTaxiCheater()

void Player::SetTaxiCheater ( bool  on)
inline

◆ setTeamId()

void Player::setTeamId ( TeamId  teamid)
inline
2110{ m_team = teamid; };

References m_team.

◆ SetTemporaryUnsummonedPetNumber()

void Player::SetTemporaryUnsummonedPetNumber ( uint32  petnumber)
inline

◆ SetTitle()

void Player::SetTitle ( CharTitlesEntry const *  title,
bool  lost = false 
)
13383{
13384 uint32 fieldIndexOffset = title->bit_index / 32;
13385 uint32 flag = 1 << (title->bit_index % 32);
13386
13387 if (lost)
13388 {
13389 if (!HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13390 return;
13391
13392 // Clear the current title if it is the one being removed.
13393 if (title->bit_index == GetUInt32Value(PLAYER_CHOSEN_TITLE))
13394 {
13395 SetCurrentTitle(nullptr, true);
13396 }
13397
13398 RemoveFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13399 }
13400 else
13401 {
13402 if (HasFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag))
13403 return;
13404
13405 SetFlag(PLAYER__FIELD_KNOWN_TITLES + fieldIndexOffset, flag);
13406 }
13407
13408 WorldPacket data(SMSG_TITLE_EARNED, 4 + 4);
13409 data << uint32(title->bit_index);
13410 data << uint32(lost ? 0 : 1); // 1 - earned, 0 - lost
13411 SendDirectMessage(&data);
13412
13414}
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK
Definition DBCEnums.h:158
void SetCurrentTitle(CharTitlesEntry const *title, bool clear=false)
Definition Player.h:2548
@ SMSG_TITLE_EARNED
Definition Opcodes.h:913

References ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK, CharTitlesEntry::bit_index, Object::GetUInt32Value(), Object::HasFlag(), PLAYER__FIELD_KNOWN_TITLES, PLAYER_CHOSEN_TITLE, Object::RemoveFlag(), SendDirectMessage(), SetCurrentTitle(), Object::SetFlag(), SMSG_TITLE_EARNED, and UpdateAchievementCriteria().

Referenced by _LoadQuestStatusRewarded(), AchievementMgr::CompletedAchievement(), titles_commandscript::HandleTitlesAddCommand(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), AchievementMgr::LoadFromDB(), and RewardQuest().

◆ SetViewpoint()

void Player::SetViewpoint ( WorldObject target,
bool  apply 
)
13217{
13218 if (apply)
13219 {
13220 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} create seer {} (TypeId: {}).", GetName(), target->GetEntry(), target->GetTypeId());
13221
13222 if (!AddGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13223 {
13224 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot add new viewpoint!", GetName());
13225 return;
13226 }
13227
13228 // farsight dynobj or puppet may be very far away
13229 UpdateVisibilityOf(target);
13230
13231 if (target->IsUnit() && !GetVehicle())
13232 ((Unit*)target)->AddPlayerToVision(this);
13233 SetSeer(target);
13234 }
13235 else
13236 {
13237 //must immediately set seer back otherwise may crash
13238 m_seer = this;
13239
13240 LOG_DEBUG("maps", "Player::CreateViewpoint: Player {} remove seer", GetName());
13241
13242 if (!RemoveGuidValue(PLAYER_FARSIGHT, target->GetGUID()))
13243 {
13244 LOG_DEBUG("entities.player", "Player::CreateViewpoint: Player {} cannot remove current viewpoint!", GetName());
13245 return;
13246 }
13247
13248 if (target->IsUnit() && !GetVehicle())
13249 static_cast<Unit*>(target)->RemovePlayerFromVision(this);
13250
13251 // must immediately set seer back otherwise may crash
13252 SetSeer(this);
13253
13254 //WorldPacket data(SMSG_CLEAR_FAR_SIGHT_IMMEDIATE, 0);
13255 //SendDirectMessage(&data);
13256 }
13257}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:675
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:693
void SetSeer(WorldObject *target)
Definition Player.h:2353
void UpdateVisibilityOf(WorldObject *target)
Definition PlayerUpdates.cpp:1703

References Object::AddGuidValue(), Object::GetEntry(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), Unit::GetVehicle(), Object::IsUnit(), LOG_DEBUG, m_seer, PLAYER_FARSIGHT, Object::RemoveGuidValue(), Unit::RemovePlayerFromVision(), SetSeer(), and UpdateVisibilityOf().

Referenced by CinematicMgr::BeginCinematic(), CinematicMgr::EndCinematic(), AuraEffect::HandleBindSight(), WorldSession::HandleFarSightOpcode(), RemoveFromWorld(), and SetClientControl().

◆ SetVirtualItemSlot()

void Player::SetVirtualItemSlot ( uint8  i,
Item item 
)
Todo:
: this import is not necessary for compilation and marked as unused by the IDE
79{
80 ASSERT(i < 3);
81 if (i < 2 && item)
82 {
84 return;
86 if (charges == 0)
87 return;
88 if (charges > 1)
90 else if (charges <= 1)
91 {
94 }
95 }
96}

References ApplyEnchantment(), ASSERT, Item::ClearEnchantment(), Item::GetEnchantmentCharges(), Item::GetEnchantmentId(), Item::SetEnchantmentCharges(), and TEMP_ENCHANTMENT_SLOT.

Referenced by SetSheath().

◆ SetVisibleItemSlot()

void Player::SetVisibleItemSlot ( uint8  slot,
Item pItem 
)

◆ setWeaponChangeTimer()

void Player::setWeaponChangeTimer ( uint32  time)
inline
1601{m_weaponChangeTimer = time;}

References m_weaponChangeTimer.

◆ SetWeeklyQuestStatus()

void Player::SetWeeklyQuestStatus ( uint32  quest_id)
12183{
12184 m_weeklyquests.insert(quest_id);
12185 m_WeeklyQuestChanged = true;
12186}

References m_WeeklyQuestChanged, and m_weeklyquests.

Referenced by RewardQuest().

◆ SpawnCorpseBones()

void Player::SpawnCorpseBones ( bool  triggerSave = true)
4707{
4709 if (GetMap()->ConvertCorpseToBones(GetGUID()))
4710 if (triggerSave && !GetSession()->PlayerLogoutWithSave()) // at logout we will already store the player
4711 {
4712 // prevent loading as ghost without corpse
4713 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
4714
4715 // pussywizard: update only ghost flag instead of whole character table entry! data integrity is crucial
4717 stmt->SetData(0, GetGUID().GetCounter());
4718 trans->Append(stmt);
4719
4720 _SaveAuras(trans, false);
4721
4722 CharacterDatabase.CommitTransaction(trans);
4723 }
4724}
@ CHAR_UPD_CHAR_REMOVE_GHOST
Definition CharacterDatabase.h:431

References _corpseLocation, _SaveAuras(), CHAR_UPD_CHAR_REMOVE_GHOST, CharacterDatabase, Object::GetGUID(), WorldObject::GetMap(), GetSession(), PreparedStatementBase::SetData(), and WorldLocation::WorldRelocate().

Referenced by Battleground::_ProcessResurrect(), CreateCorpse(), Spell::EffectSelfResurrect(), WorldSession::HandleAreaTriggerOpcode(), WorldSession::HandleBattleFieldPortOpcode(), group_commandscript::HandleGroupReviveCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandleReclaimCorpseOpcode(), LoadCorpse(), ProcessDelayedOperations(), Battleground::RemovePlayerAtLeave(), RepopAtGraveyard(), ResurectUsingRequestData(), BfGraveyard::Resurrect(), and WorldSession::SendSpiritResurrect().

◆ SplitItem()

void Player::SplitItem ( uint16  src,
uint16  dst,
uint32  count 
)

If trading

If current item is in trade window (only possible with packet spoofing - silent return)

3421{
3422 uint8 srcbag = src >> 8;
3423 uint8 srcslot = src & 255;
3424
3425 uint8 dstbag = dst >> 8;
3426 uint8 dstslot = dst & 255;
3427
3428 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3429 if (!pSrcItem)
3430 {
3431 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3432 return;
3433 }
3434
3435 if (pSrcItem->m_lootGenerated) // prevent split looting item (item
3436 {
3437 //best error message found for attempting to split while looting
3439 return;
3440 }
3441
3442 // not let split all items (can be only at cheating)
3443 if (pSrcItem->GetCount() == count)
3444 {
3446 return;
3447 }
3448
3449 // not let split more existed items (can be only at cheating)
3450 if (pSrcItem->GetCount() < count)
3451 {
3453 return;
3454 }
3455
3457 if (TradeData* tradeData = GetTradeData())
3458 {
3460 if (tradeData->GetTradeSlotForItem(pSrcItem->GetGUID()) != TRADE_SLOT_INVALID)
3461 return;
3462 }
3463
3464 LOG_DEBUG("entities.player.items", "STORAGE: SplitItem bag = {}, slot = {}, item = {}, count = {}", dstbag, dstslot, pSrcItem->GetEntry(), count);
3465 Item* pNewItem = pSrcItem->CloneItem(count, this);
3466 if (!pNewItem)
3467 {
3468 SendEquipError(EQUIP_ERR_ITEM_NOT_FOUND, pSrcItem, nullptr);
3469 return;
3470 }
3471
3472 if (IsInventoryPos(dst))
3473 {
3474 // change item amount before check (for unique max count check)
3475 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3476
3477 ItemPosCountVec dest;
3478 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pNewItem, false);
3479 if (msg != EQUIP_ERR_OK)
3480 {
3481 delete pNewItem;
3482 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3483 SendEquipError(msg, pSrcItem, nullptr);
3484 return;
3485 }
3486
3487 if (IsInWorld())
3488 pSrcItem->SendUpdateToPlayer(this);
3489 pSrcItem->SetState(ITEM_CHANGED, this);
3490 StoreItem(dest, pNewItem, true);
3491 }
3492 else if (IsBankPos(dst))
3493 {
3494 // change item amount before check (for unique max count check)
3495 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3496
3497 ItemPosCountVec dest;
3498 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pNewItem, false);
3499 if (msg != EQUIP_ERR_OK)
3500 {
3501 delete pNewItem;
3502 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3503 SendEquipError(msg, pSrcItem, nullptr);
3504 return;
3505 }
3506
3507 if (IsInWorld())
3508 pSrcItem->SendUpdateToPlayer(this);
3509 pSrcItem->SetState(ITEM_CHANGED, this);
3510 BankItem(dest, pNewItem, true);
3511 }
3512 else if (IsEquipmentPos(dst))
3513 {
3514 // change item amount before check (for unique max count check), provide space for splitted items
3515 pSrcItem->SetCount(pSrcItem->GetCount() - count);
3516
3517 uint16 dest;
3518 InventoryResult msg = CanEquipItem(dstslot, dest, pNewItem, false);
3519 if (msg != EQUIP_ERR_OK)
3520 {
3521 delete pNewItem;
3522 pSrcItem->SetCount(pSrcItem->GetCount() + count);
3523 SendEquipError(msg, pSrcItem, nullptr);
3524 return;
3525 }
3526
3527 if (IsInWorld())
3528 pSrcItem->SendUpdateToPlayer(this);
3529 pSrcItem->SetState(ITEM_CHANGED, this);
3530 EquipItem(dest, pNewItem, true);
3532 }
3533}
@ EQUIP_ERR_COULDNT_SPLIT_ITEMS
Definition Item.h:74
@ EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT
Definition Item.h:73
@ TRADE_SLOT_INVALID
Definition TradeData.h:32
TradeData * GetTradeData() const
Definition Player.h:1375
Definition TradeData.h:36

References AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), Item::CloneItem(), EQUIP_ERR_COULDNT_SPLIT_ITEMS, EQUIP_ERR_ITEM_NOT_FOUND, EQUIP_ERR_OK, EQUIP_ERR_TRIED_TO_SPLIT_MORE_THAN_COUNT, EquipItem(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), GetTradeData(), IsBankPos(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), ITEM_CHANGED, LOG_DEBUG, Item::m_lootGenerated, SendEquipError(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), and TRADE_SLOT_INVALID.

Referenced by WorldSession::HandleSplitItemOpcode().

◆ StartTimedAchievement()

void Player::StartTimedAchievement ( AchievementCriteriaTimedTypes  type,
uint32  entry,
uint32  timeLost = 0 
)
13974{
13975 m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
13976}
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost=0)
Definition AchievementMgr.cpp:2221

References m_achievementMgr, and AchievementMgr::StartTimedAchievement().

Referenced by Spell::_cast(), AddQuest(), Spell::DoSpellHitOnUnit(), InstanceScript::DoStartTimedAchievement(), BattlegroundWS::EventPlayerClickedOnFlag(), and KilledMonsterCredit().

◆ StopCastingBindSight()

void Player::StopCastingBindSight ( Aura except = nullptr)
13204{
13205 if (WorldObject* target = GetViewpoint())
13206 {
13207 if (target->IsUnit())
13208 {
13209 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID(), except);
13210 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID(), except);
13211 ((Unit*)target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID(), except);
13212 }
13213 }
13214}
@ SPELL_AURA_MOD_POSSESS_PET
Definition SpellAuraDefines.h:191
@ SPELL_AURA_MOD_POSSESS
Definition SpellAuraDefines.h:65
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References Object::GetGUID(), GetViewpoint(), SPELL_AURA_BIND_SIGHT, SPELL_AURA_MOD_POSSESS, and SPELL_AURA_MOD_POSSESS_PET.

Referenced by ActivateTaxiPathTo(), misc_commandscript::HandleUnbindSightCommand(), RemoveFromWorld(), and Unit::SetCharmedBy().

◆ StopCastingCharm()

void Player::StopCastingCharm ( Aura except = nullptr)
9365{
9366 Unit* charm = GetCharm();
9367 if (!charm)
9368 {
9369 return;
9370 }
9371
9372 if (charm->IsCreature())
9373 {
9375 {
9376 ((Puppet*)charm)->UnSummon();
9377 }
9378 else if (charm->IsVehicle())
9379 {
9380 ExitVehicle();
9381 }
9382 }
9383
9384 if (GetCharmGUID())
9385 {
9390 }
9391
9392 if (GetCharmGUID())
9393 {
9394 LOG_FATAL("entities.player", "Player {} ({} is not able to uncharm unit ({})", GetName(), GetGUID().ToString(), GetCharmGUID().ToString());
9395
9396 if (charm->GetCharmerGUID())
9397 {
9398 LOG_FATAL("entities.player", "Charmed unit has charmer {}", charm->GetCharmerGUID().ToString());
9399 ABORT();
9400 }
9401 else
9402 {
9403 SetCharm(charm, false);
9404 }
9405 }
9406}
#define ABORT
Definition Errors.h:76
@ SPELL_AURA_MOD_CHARM
Definition SpellAuraDefines.h:69
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240
@ UNIT_MASK_PUPPET
Definition UnitDefines.h:162
Definition TemporarySummon.h:115
bool IsVehicle() const
Definition Unit.h:783
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:10952
ObjectGuid GetCharmGUID() const
Definition Unit.h:706

References ABORT, ObjectGuid::Empty, Unit::ExitVehicle(), Unit::GetCharm(), Unit::GetCharmerGUID(), Unit::GetCharmGUID(), Object::GetGUID(), WorldObject::GetName(), Unit::HasUnitTypeMask(), Object::IsCreature(), Unit::IsVehicle(), LOG_FATAL, Unit::RemoveAurasByType(), Unit::SetCharm(), SPELL_AURA_AOE_CHARM, SPELL_AURA_MOD_CHARM, SPELL_AURA_MOD_POSSESS, SPELL_AURA_MOD_POSSESS_PET, Object::ToCreature(), ObjectGuid::ToString(), Position::ToString(), and UNIT_MASK_PUPPET.

Referenced by ActivateTaxiPathTo(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), Unit::RemoveAllControlled(), RemoveFromWorld(), Unit::SetCharmedBy(), and npc_chesspiece::sGossipSelect().

◆ StopMirrorTimer()

void Player::StopMirrorTimer ( MirrorTimerType  Type)
protected

◆ StopMirrorTimers()

◆ StoreItem()

Item * Player::StoreItem ( ItemPosCountVec const &  pos,
Item pItem,
bool  update 
)
2581{
2582 if (!pItem)
2583 return nullptr;
2584
2585 Item* lastItem = pItem;
2586 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end();)
2587 {
2588 uint16 pos = itr->pos;
2589 uint32 count = itr->count;
2590
2591 ++itr;
2592
2593 if (itr == dest.end())
2594 {
2595 lastItem = _StoreItem(pos, pItem, count, false, update);
2596 break;
2597 }
2598
2599 lastItem = _StoreItem(pos, pItem, count, true, update);
2600 }
2601
2602 return lastItem;
2603}
Item * _StoreItem(uint16 pos, Item *pItem, uint32 count, bool clone, bool update)
Definition PlayerStorage.cpp:2606

References _StoreItem().

Referenced by _LoadInventory(), AutoUnequipOffhandIfNeed(), BankItem(), Create(), Spell::EffectSummonChangeItem(), WorldSession::HandleAutoEquipItemOpcode(), WorldSession::HandleAutoStoreBagItemOpcode(), WorldSession::HandleAutoStoreBankItemOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleEquipmentSetUse(), WorldSession::HandleMailCreateTextItem(), MoveItemToInventory(), SplitItem(), StoreNewItem(), and SwapItem().

◆ StoreLootItem()

LootItem * Player::StoreLootItem ( uint8  lootSlot,
Loot loot,
InventoryResult msg 
)
13564{
13565 QuestItem* qitem = nullptr;
13566 QuestItem* ffaitem = nullptr;
13567 QuestItem* conditem = nullptr;
13568
13569 msg = EQUIP_ERR_OK;
13570
13571 LootItem* item = loot->LootItemInSlot(lootSlot, this, &qitem, &ffaitem, &conditem);
13572 if (!item || item->is_looted)
13573 {
13574 if (!sScriptMgr->OnPlayerCanSendErrorAlreadyLooted(this))
13575 {
13576 SendEquipError(EQUIP_ERR_ALREADY_LOOTED, nullptr, nullptr);
13577 }
13578 return nullptr;
13579 }
13580
13581 // Xinef: exploit protection, dont allow to loot normal items if player is not master loot and not below loot threshold
13582 // Xinef: only quest, ffa and conditioned items
13583 if (!item->is_underthreshold && loot->roundRobinPlayer && !GetLootGUID().IsItem() && GetGroup() && GetGroup()->GetLootMethod() == MASTER_LOOT && GetGUID() != GetGroup()->GetMasterLooterGuid())
13584 if (!qitem && !ffaitem && !conditem)
13585 {
13587 return nullptr;
13588 }
13589
13590 if (!item->AllowedForPlayer(this, loot->sourceWorldObjectGUID))
13591 {
13593 return nullptr;
13594 }
13595
13596 // questitems use the blocked field for other purposes
13597 if (!qitem && item->is_blocked)
13598 {
13600 return nullptr;
13601 }
13602
13603 // xinef: dont allow protected item to be looted by someone else
13604 if (item->rollWinnerGUID && item->rollWinnerGUID != GetGUID())
13605 {
13607 return nullptr;
13608 }
13609
13610 ItemPosCountVec dest;
13611 msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
13612 if (msg == EQUIP_ERR_OK)
13613 {
13614 AllowedLooterSet looters = item->GetAllowedLooters();
13615 Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, looters);
13616
13617 if (qitem)
13618 {
13619 qitem->is_looted = true;
13620 //freeforall is 1 if everyone's supposed to get the quest item.
13621 if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
13622 SendNotifyLootItemRemoved(lootSlot);
13623 else
13624 loot->NotifyQuestItemRemoved(qitem->index);
13625 }
13626 else
13627 {
13628 if (ffaitem)
13629 {
13630 //freeforall case, notify only one player of the removal
13631 ffaitem->is_looted = true;
13632 SendNotifyLootItemRemoved(lootSlot);
13633 }
13634 else
13635 {
13636 //not freeforall, notify everyone
13637 if (conditem)
13638 conditem->is_looted = true;
13639 loot->NotifyItemRemoved(lootSlot);
13640 }
13641 }
13642
13643 //if only one person is supposed to loot the item, then set it to looted
13644 if (!item->freeforall)
13645 item->is_looted = true;
13646
13647 --loot->unlootedCount;
13648
13649 SendNewItem(newitem, uint32(item->count), false, false, true);
13650 UpdateLootAchievements(item, loot);
13651
13652 // LootItem is being removed (looted) from the container, delete it from the DB.
13653 if (loot->containerGUID)
13654 sLootItemStorage->RemoveStoredLootItem(loot->containerGUID, item->itemid, item->count, loot, item->itemIndex);
13655
13656 sScriptMgr->OnPlayerLootItem(this, newitem, item->count, this->GetLootGUID());
13657 }
13658 else
13659 {
13660 SendEquipError(msg, nullptr, nullptr, item->itemid);
13661 }
13662
13663 return item;
13664}
bool IsItem() const
Definition Object.h:225
void UpdateLootAchievements(LootItem *item, Loot *loot)
Definition PlayerUpdates.cpp:2150
void SendNotifyLootItemRemoved(uint8 lootSlot)
Definition Player.cpp:8237
bool is_blocked
Definition LootMgr.h:164
ObjectGuid rollWinnerGUID
Definition LootMgr.h:161
bool is_underthreshold
Definition LootMgr.h:166
bool AllowedForPlayer(Player const *player, ObjectGuid source) const
Definition LootMgr.cpp:417
uint32 itemIndex
Definition LootMgr.h:156
bool is_looted
Definition LootMgr.h:163
const AllowedLooterSet & GetAllowedLooters() const
Definition LootMgr.h:181
bool freeforall
Definition LootMgr.h:165
ObjectGuid sourceWorldObjectGUID
Definition LootMgr.h:330
void NotifyQuestItemRemoved(uint8 questIndex)
Definition LootMgr.cpp:804
QuestItemMap const & GetPlayerQuestItems() const
Definition LootMgr.h:316
void NotifyItemRemoved(uint8 lootIndex)
Definition LootMgr.cpp:773
Definition LootMgr.h:185
uint8 index
Definition LootMgr.h:186
bool is_looted
Definition LootMgr.h:187

References LootItem::AllowedForPlayer(), CanStoreNewItem(), Loot::containerGUID, LootItem::count, EQUIP_ERR_ALREADY_LOOTED, EQUIP_ERR_OK, LootItem::freeforall, LootItem::GetAllowedLooters(), GetGroup(), Object::GetGUID(), GetLootGUID(), Loot::GetPlayerQuestItems(), QuestItem::index, LootItem::is_blocked, LootItem::is_looted, QuestItem::is_looted, LootItem::is_underthreshold, Object::IsItem(), LootItem::itemid, LootItem::itemIndex, Loot::LootItemInSlot(), MASTER_LOOT, Loot::NotifyItemRemoved(), Loot::NotifyQuestItemRemoved(), NULL_BAG, NULL_SLOT, LootItem::randomPropertyId, LootItem::rollWinnerGUID, Loot::roundRobinPlayer, SendEquipError(), SendLootRelease(), SendNewItem(), SendNotifyLootItemRemoved(), sLootItemStorage, Loot::sourceWorldObjectGUID, sScriptMgr, StoreNewItem(), Loot::unlootedCount, and UpdateLootAchievements().

Referenced by Loot::FillNotNormalLootFor(), and WorldSession::HandleAutostoreLootItemOpcode().

◆ StoreNewItem() [1/2]

Item * Player::StoreNewItem ( ItemPosCountVec const &  pos,
uint32  item,
bool  update,
int32  randomPropertyId,
AllowedLooterSet allowedLooters 
)
2538{
2539 uint32 count = 0;
2540 for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
2541 count += itr->count;
2542
2543 Item* pItem = Item::CreateItem(item, count, this, false, randomPropertyId);
2544 if (pItem)
2545 {
2546 // pussywizard: obtaining blue or better items saves to db
2547 if (ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(item))
2548 if (pProto->Quality >= ITEM_QUALITY_RARE)
2550
2551 ItemAddedQuestCheck(item, count);
2554 pItem = StoreItem(dest, pItem, update);
2555
2556 if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound() && sWorld->getBoolConfig(CONFIG_SET_BOP_ITEM_TRADEABLE))
2557 {
2558 pItem->SetSoulboundTradeable(allowedLooters);
2560 AddTradeableItem(pItem);
2561
2562 // save data
2563 std::ostringstream ss;
2564 AllowedLooterSet::const_iterator itr = allowedLooters.begin();
2565 ss << (*itr).GetCounter();
2566 for (++itr; itr != allowedLooters.end(); ++itr)
2567 ss << ' ' << (*itr).GetCounter();
2568
2570 stmt->SetData(0, pItem->GetGUID().GetCounter());
2571 stmt->SetData(1, ss.str());
2572 CharacterDatabase.Execute(stmt);
2573 }
2574
2575 sScriptMgr->OnPlayerStoreNewItem(this, pItem, count);
2576 }
2577 return pItem;
2578}
@ CHAR_INS_ITEM_BOP_TRADE
Definition CharacterDatabase.h:122
@ ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM
Definition DBCEnums.h:150
@ ITEM_FIELD_CREATE_PLAYED_TIME
Definition UpdateFields.h:71
@ CONFIG_SET_BOP_ITEM_TRADEABLE
Definition WorldConfig.h:126

References ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, ADDITIONAL_SAVING_INVENTORY_AND_GOLD, AdditionalSavingAddMask(), AddTradeableItem(), CHAR_INS_ITEM_BOP_TRADE, CharacterDatabase, CONFIG_SET_BOP_ITEM_TRADEABLE, Item::CreateItem(), ObjectGuid::GetCounter(), Object::GetGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), GetTotalPlayedTime(), Item::IsSoulBound(), ITEM_FIELD_CREATE_PLAYED_TIME, ITEM_QUALITY_RARE, ItemAddedQuestCheck(), PreparedStatementBase::SetData(), Item::SetSoulboundTradeable(), Object::SetUInt32Value(), sObjectMgr, sScriptMgr, StoreItem(), sWorld, and UpdateAchievementCriteria().

◆ StoreNewItem() [2/2]

◆ StoreNewItemInBestSlots()

bool Player::StoreNewItemInBestSlots ( uint32  item_id,
uint32  item_count 
)
711{
712 LOG_DEBUG("entities.player.items", "STORAGE: Creating initial item, itemId = {}, count = {}", titem_id, titem_amount);
713
714 // attempt equip by one
715 while (titem_amount > 0)
716 {
717 uint16 eDest;
718 InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
719 if (msg != EQUIP_ERR_OK)
720 break;
721
722 EquipNewItem(eDest, titem_id, true);
724 --titem_amount;
725 }
726
727 if (titem_amount == 0)
728 return true; // equipped
729
730 // attempt store
731 ItemPosCountVec sDest;
732 // store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
733 InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
734 if (msg == EQUIP_ERR_OK)
735 {
736 StoreNewItem(sDest, titem_id, true);
737 return true; // stored
738 }
739
740 // item can't be added
741 LOG_ERROR("entities.player", "STORAGE: Can't equip or store initial item {} for race {} class {}, error msg = {}", titem_id, getRace(true), getClass(), msg);
742 return false;
743}

References AutoUnequipOffhandIfNeed(), CanEquipNewItem(), CanStoreNewItem(), EQUIP_ERR_OK, EquipNewItem(), Unit::getClass(), Unit::getRace(), INVENTORY_SLOT_BAG_0, LOG_DEBUG, LOG_ERROR, NULL_SLOT, and StoreNewItem().

Referenced by Create().

◆ StoreRaidMapDifficulty()

void Player::StoreRaidMapDifficulty ( )
inline

◆ SummonIfPossible()

void Player::SummonIfPossible ( bool  agree,
ObjectGuid  summoner_guid 
)
12469{
12470 if (!agree)
12471 {
12472 m_summon_expire = 0;
12473 return;
12474 }
12475
12476 // expire and auto declined
12477 if (m_summon_expire < GameTime::GetGameTime().count())
12478 return;
12479
12480 // drop flag at summon
12481 // this code can be reached only when GM is summoning player who carries flag, because player should be immune to summoning spells when he carries flag
12482 if (Battleground* bg = GetBattleground())
12483 bg->EventPlayerDroppedFlag(this);
12484
12485 m_summon_expire = 0;
12486
12488
12490}
@ ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS
Definition DBCEnums.h:220
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245

References ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, ObjectAccessor::FindPlayer(), GetBattleground(), GameTime::GetGameTime(), Position::GetOrientation(), m_summon_expire, m_summon_mapid, m_summon_x, m_summon_y, m_summon_z, TeleportTo(), and UpdateAchievementCriteria().

Referenced by WorldSession::HandleSummonResponseOpcode().

◆ SummonPet()

Pet * Player::SummonPet ( uint32  entry,
float  x,
float  y,
float  z,
float  ang,
PetType  petType,
Milliseconds  duration = 0ms,
uint32  healthPct = 0 
)
9001{
9002 PetStable& petStable = GetOrInitPetStable();
9003
9004 Pet* pet = new Pet(this, petType);
9005
9006 if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry, 0, false, healthPct))
9007 {
9008 // Remove Demonic Sacrifice auras (known pet)
9010 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
9011 {
9012 if ((*itr)->GetMiscValue() == 2228)
9013 {
9014 RemoveAurasDueToSpell((*itr)->GetId());
9015 itr = auraClassScripts.begin();
9016 }
9017 else
9018 ++itr;
9019 }
9020
9021 if (duration > 0ms)
9022 pet->SetDuration(duration);
9023
9024 // Generate a new name for the newly summoned ghoul
9025 if (pet->IsPetGhoul())
9026 {
9027 std::string new_name = sObjectMgr->GeneratePetNameLocale(entry, GetSession()->GetSessionDbLocaleIndex());
9028 if (!new_name.empty())
9029 pet->SetName(new_name);
9030 }
9031
9032 return nullptr;
9033 }
9034
9035 // petentry == 0 for hunter "call pet" (current pet summoned if any)
9036 if (!entry)
9037 {
9038 delete pet;
9039 return nullptr;
9040 }
9041
9042 pet->Relocate(x, y, z, ang);
9043 if (!pet->IsPositionValid())
9044 {
9045 LOG_ERROR("misc", "Player::SummonPet: Pet ({}, Entry: {}) not summoned. Suggested coordinates aren't valid (X: {} Y: {})", pet->GetGUID().ToString(), pet->GetEntry(), pet->GetPositionX(), pet->GetPositionY());
9046 delete pet;
9047 return nullptr;
9048 }
9049
9050 Map* map = GetMap();
9051 uint32 pet_number = sObjectMgr->GeneratePetNumber();
9052 if (!pet->Create(map->GenerateLowGuid<HighGuid::Pet>(), map, GetPhaseMask(), entry, pet_number))
9053 {
9054 LOG_ERROR("misc", "Player::SummonPet: No such creature entry {}", entry);
9055 delete pet;
9056 return nullptr;
9057 }
9058
9059 if (petType == SUMMON_PET && petStable.CurrentPet)
9061
9062 pet->SetCreatorGUID(GetGUID());
9063 pet->SetFaction(GetFaction());
9068
9069 SetMinion(pet, true);
9070
9071 if (petType == SUMMON_PET)
9072 {
9074 {
9075 pet->GetCharmInfo()->SetPetNumber(pet_number, true); // Show pet details tab (Shift+P) only for demons & undead
9076 }
9077 else
9078 {
9079 pet->GetCharmInfo()->SetPetNumber(pet_number, false);
9080 }
9081
9084 pet->SetFullHealth();
9086 pet->SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped in this case
9087 }
9088
9089 map->AddToMap(pet->ToCreature(), true);
9090
9091 ASSERT(!petStable.CurrentPet && (petType != HUNTER_PET || !petStable.GetUnslottedHunterPet()));
9092 pet->FillPetInfo(&petStable.CurrentPet.emplace());
9093
9094 if (petType == SUMMON_PET)
9095 {
9096 pet->InitPetCreateSpells();
9097 pet->InitTalentForLevel();
9100
9101 // Remove Demonic Sacrifice auras (known pet)
9103 for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
9104 {
9105 if ((*itr)->GetMiscValue() == 2228)
9106 {
9107 RemoveAurasDueToSpell((*itr)->GetId());
9108 itr = auraClassScripts.begin();
9109 }
9110 else
9111 ++itr;
9112 }
9113 }
9114
9115 if (duration > 0ms)
9116 pet->SetDuration(duration);
9117
9119 {
9122 }
9123
9124 return pet;
9125}
@ SUMMON_PET
Definition PetDefines.h:32
@ CREATURE_TYPE_UNDEAD
Definition SharedDefines.h:2644
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2641
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175
@ UNIT_NPC_FLAG_NONE
Definition UnitDefines.h:318
@ UNIT_FIELD_PETEXPERIENCE
Definition UpdateFields.h:134
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
@ UNIT_FIELD_PETNEXTLEVELEXP
Definition UpdateFields.h:135
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
ObjectGuid::LowType GenerateLowGuid()
Definition Map.h:480
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2477
bool Create(ObjectGuid::LowType guidlow, Map *map, uint32 phaseMask, uint32 Entry, uint32 pet_number)
Definition Pet.cpp:2321
void SetDuration(Milliseconds dur)
Definition Pet.h:90
void InitPetCreateSpells()
Definition Pet.cpp:2052
PetStable & GetOrInitPetStable()
Definition Player.cpp:15700
float GetHealthPct() const
Definition Unit.h:1072
void ReplaceAllNpcFlags(NPCFlags flags)
Definition Unit.h:751
void SetName(std::string const &newname)
Definition Object.h:526
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240
uint32 type
Definition CreatureData.h:222

References Map::AddToMap(), ASSERT, Pet::Create(), CREATURE_TYPE_DEMON, CREATURE_TYPE_UNDEAD, PetStable::CurrentPet, CreatureTemplate::family, Pet::FillPetInfo(), WorldObject::FindMap(), Map::GenerateLowGuid(), Unit::GetAuraEffectsByType(), Unit::GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), Unit::GetFaction(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), Unit::GetHealthPct(), Unit::GetLevel(), WorldObject::GetMap(), Unit::GetMaxPower(), GetOrInitPetStable(), WorldObject::GetPhaseMask(), Position::GetPositionX(), Position::GetPositionY(), GetSession(), PetStable::GetUnslottedHunterPet(), HUNTER_PET, Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Pet::InitTalentForLevel(), Minion::IsPetGhoul(), Position::IsPositionValid(), Pet::LoadPetFromDB(), LOG_ERROR, NeedSendSpectatorData(), Pet, PET_SAVE_AS_CURRENT, PET_SAVE_NOT_IN_SLOT, PetSpellInitialize(), POWER_MANA, Position::Relocate(), Unit::RemoveAurasDueToSpell(), RemovePet(), Unit::ReplaceAllNpcFlags(), Pet::SavePetToDB(), ArenaSpectator::SendCommand_UInt32Value(), Unit::SetCreatorGUID(), Pet::SetDuration(), Unit::SetFaction(), Unit::SetFullHealth(), Unit::SetMinion(), WorldObject::SetName(), CharmInfo::SetPetNumber(), Unit::SetPower(), Unit::setPowerType(), Unit::SetUInt32Value(), sObjectMgr, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SUMMON_PET, Object::ToCreature(), ObjectGuid::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_1, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FIELD_PETEXPERIENCE, UNIT_FIELD_PETNEXTLEVELEXP, and UNIT_NPC_FLAG_NONE.

Referenced by Spell::EffectResurrectPet(), and Spell::EffectSummonPet().

◆ SwapItem()

void Player::SwapItem ( uint16  src,
uint16  dst 
)
3536{
3537 uint8 srcbag = src >> 8;
3538 uint8 srcslot = src & 255;
3539
3540 uint8 dstbag = dst >> 8;
3541 uint8 dstslot = dst & 255;
3542
3543 Item* pSrcItem = GetItemByPos(srcbag, srcslot);
3544 Item* pDstItem = GetItemByPos(dstbag, dstslot);
3545
3546 if (!pSrcItem)
3547 return;
3548
3549 LOG_DEBUG("entities.player.items", "STORAGE: SwapItem bag = {}, slot = {}, item = {}", dstbag, dstslot, pSrcItem->GetEntry());
3550
3551 if (!IsAlive())
3552 {
3553 SendEquipError(EQUIP_ERR_YOU_ARE_DEAD, pSrcItem, pDstItem);
3554 return;
3555 }
3556
3557 // SRC checks
3558
3559 if (GetLootGUID() == pSrcItem->GetGUID()) // prevent swap looting item
3560 {
3561 //best error message found for attempting to swap while looting
3562 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pSrcItem, nullptr);
3563 return;
3564 }
3565
3566 // check unequip potability for equipped items and bank bags
3567 if (IsEquipmentPos(src) || IsBagPos(src))
3568 {
3569 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3570 InventoryResult msg = CanUnequipItem(src, !IsBagPos(src) || IsBagPos(dst) || (pDstItem && pDstItem->ToBag() && pDstItem->ToBag()->IsEmpty()));
3571 if (msg != EQUIP_ERR_OK)
3572 {
3573 SendEquipError(msg, pSrcItem, pDstItem);
3574 return;
3575 }
3576 }
3577
3578 // anti-wpe
3579 if (pSrcItem->IsBag() && pSrcItem->IsNotEmptyBag() && !IsBagPos(dst))
3580 {
3582 return;
3583 }
3584
3585 // prevent put equipped/bank bag in self
3586 if (IsBagPos(src) && srcslot == dstbag)
3587 {
3589 return;
3590 }
3591
3592 // prevent equipping bag in the same slot from its inside
3593 if (IsBagPos(dst) && srcbag == dstslot)
3594 {
3596 return;
3597 }
3598
3599 // DST checks
3600
3601 if (pDstItem)
3602 {
3603 // Xinef: Removed next loot generated check
3604 if (pDstItem->GetGUID() == GetLootGUID()) // prevent swap looting item
3605 {
3606 //best error message found for attempting to swap while looting
3607 SendEquipError(EQUIP_ERR_CANT_DO_RIGHT_NOW, pDstItem, nullptr);
3608 return;
3609 }
3610
3611 // check unequip potability for equipped items and bank bags
3612 if (IsEquipmentPos(dst) || IsBagPos(dst))
3613 {
3614 // bags can be swapped with empty bag slots, or with empty bag (items move possibility checked later)
3615 InventoryResult msg = CanUnequipItem(dst, !IsBagPos(dst) || IsBagPos(src) || (pSrcItem->ToBag() && pSrcItem->ToBag()->IsEmpty()));
3616 if (msg != EQUIP_ERR_OK)
3617 {
3618 SendEquipError(msg, pSrcItem, pDstItem);
3619 return;
3620 }
3621 }
3622 }
3623
3624 // NOW this is or item move (swap with empty), or swap with another item (including bags in bag possitions)
3625 // or swap empty bag with another empty or not empty bag (with items exchange)
3626
3627 // Move case
3628 if (!pDstItem)
3629 {
3630 if (IsInventoryPos(dst))
3631 {
3632 ItemPosCountVec dest;
3633 InventoryResult msg = CanStoreItem(dstbag, dstslot, dest, pSrcItem, false);
3634 if (msg != EQUIP_ERR_OK)
3635 {
3636 SendEquipError(msg, pSrcItem, nullptr);
3637 return;
3638 }
3639
3640 RemoveItem(srcbag, srcslot, true);
3641 StoreItem(dest, pSrcItem, true);
3643 if (IsBankPos(src))
3644 ItemAddedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3645 }
3646 else if (IsBankPos(dst))
3647 {
3648 ItemPosCountVec dest;
3649 InventoryResult msg = CanBankItem(dstbag, dstslot, dest, pSrcItem, false);
3650 if (msg != EQUIP_ERR_OK)
3651 {
3652 SendEquipError(msg, pSrcItem, nullptr);
3653 return;
3654 }
3655
3656 RemoveItem(srcbag, srcslot, true);
3657 BankItem(dest, pSrcItem, true);
3659 ItemRemovedQuestCheck(pSrcItem->GetEntry(), pSrcItem->GetCount());
3660 }
3661 else if (IsEquipmentPos(dst))
3662 {
3663 uint16 dest;
3664 InventoryResult msg = CanEquipItem(dstslot, dest, pSrcItem, false);
3665 if (msg != EQUIP_ERR_OK)
3666 {
3667 SendEquipError(msg, pSrcItem, nullptr);
3668 return;
3669 }
3670
3671 RemoveItem(srcbag, srcslot, true);
3672 EquipItem(dest, pSrcItem, true);
3674 }
3675
3676 return;
3677 }
3678
3679 // attempt merge to / fill target item
3680 if (!pSrcItem->IsBag() && !pDstItem->IsBag())
3681 {
3682 InventoryResult msg;
3683 ItemPosCountVec sDest;
3684 uint16 eDest = 0;
3685 if (IsInventoryPos(dst))
3686 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, false);
3687 else if (IsBankPos(dst))
3688 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, false);
3689 else if (IsEquipmentPos(dst))
3690 msg = CanEquipItem(dstslot, eDest, pSrcItem, false);
3691 else
3692 return;
3693
3694 // can be merge/fill
3695 if (msg == EQUIP_ERR_OK)
3696 {
3697 if (pSrcItem->GetCount() + pDstItem->GetCount() <= pSrcItem->GetTemplate()->GetMaxStackSize())
3698 {
3699 RemoveItem(srcbag, srcslot, true);
3700
3701 if (IsInventoryPos(dst))
3702 StoreItem(sDest, pSrcItem, true);
3703 else if (IsBankPos(dst))
3704 BankItem(sDest, pSrcItem, true);
3705 else if (IsEquipmentPos(dst))
3706 {
3707 EquipItem(eDest, pSrcItem, true);
3709 }
3710 }
3711 else
3712 {
3713 pSrcItem->SetCount(pSrcItem->GetCount() + pDstItem->GetCount() - pSrcItem->GetTemplate()->GetMaxStackSize());
3714 pDstItem->SetCount(pSrcItem->GetTemplate()->GetMaxStackSize());
3715 pSrcItem->SetState(ITEM_CHANGED, this);
3716 pDstItem->SetState(ITEM_CHANGED, this);
3717 if (IsInWorld())
3718 {
3719 pSrcItem->SendUpdateToPlayer(this);
3720 pDstItem->SendUpdateToPlayer(this);
3721 }
3722 }
3723 SendRefundInfo(pDstItem);
3724 return;
3725 }
3726 }
3727
3728 // Remove item enchantments for now and restore it later
3729 // Needed for swap sanity checks
3730 ApplyEnchantment(pSrcItem, false);
3731 if (pDstItem)
3732 {
3733 ApplyEnchantment(pDstItem, false);
3734 }
3735
3736 // impossible merge/fill, do real swap
3738
3739 // check src->dest move possibility
3740 ItemPosCountVec sDest;
3741 uint16 eDest = 0;
3742 if (IsInventoryPos(dst))
3743 msg = CanStoreItem(dstbag, dstslot, sDest, pSrcItem, true);
3744 else if (IsBankPos(dst))
3745 msg = CanBankItem(dstbag, dstslot, sDest, pSrcItem, true);
3746 else if (IsEquipmentPos(dst))
3747 {
3748 msg = CanEquipItem(dstslot, eDest, pSrcItem, true);
3749 if (msg == EQUIP_ERR_OK)
3750 msg = CanUnequipItem(eDest, true);
3751 }
3752
3753 if (msg != EQUIP_ERR_OK)
3754 {
3755 // Restore enchantments
3756 ApplyEnchantment(pSrcItem, true);
3757 if (pDstItem)
3758 {
3759 ApplyEnchantment(pDstItem, true);
3760 }
3761
3762 SendEquipError(msg, pSrcItem, pDstItem);
3763 return;
3764 }
3765
3766 // check dest->src move possibility
3767 ItemPosCountVec sDest2;
3768 uint16 eDest2 = 0;
3769 if (IsInventoryPos(src))
3770 msg = CanStoreItem(srcbag, srcslot, sDest2, pDstItem, true);
3771 else if (IsBankPos(src))
3772 msg = CanBankItem(srcbag, srcslot, sDest2, pDstItem, true);
3773 else if (IsEquipmentPos(src))
3774 {
3775 msg = CanEquipItem(srcslot, eDest2, pDstItem, true);
3776 if (msg == EQUIP_ERR_OK)
3777 msg = CanUnequipItem(eDest2, true);
3778 }
3779
3780 if (msg != EQUIP_ERR_OK)
3781 {
3782 // Restore enchantments
3783 ApplyEnchantment(pSrcItem, true);
3784 if (pDstItem)
3785 {
3786 ApplyEnchantment(pDstItem, true);
3787 }
3788
3789 SendEquipError(msg, pDstItem, pSrcItem);
3790 return;
3791 }
3792
3793 // Restore enchantments
3794 ApplyEnchantment(pSrcItem, true);
3795 if (pDstItem)
3796 {
3797 ApplyEnchantment(pDstItem, true);
3798 }
3799
3800 // Check bag swap with item exchange (one from empty in not bag possition (equipped (not possible in fact) or store)
3801 if (Bag* srcBag = pSrcItem->ToBag())
3802 {
3803 if (Bag* dstBag = pDstItem->ToBag())
3804 {
3805 Bag* emptyBag = nullptr;
3806 Bag* fullBag = nullptr;
3807 if (srcBag->IsEmpty() && !IsBagPos(src))
3808 {
3809 emptyBag = srcBag;
3810 fullBag = dstBag;
3811 }
3812 else if (dstBag->IsEmpty() && !IsBagPos(dst))
3813 {
3814 emptyBag = dstBag;
3815 fullBag = srcBag;
3816 }
3817
3818 // bag swap (with items exchange) case
3819 if (emptyBag && fullBag)
3820 {
3821 ItemTemplate const* emptyProto = emptyBag->GetTemplate();
3822
3823 uint32 count = 0;
3824
3825 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3826 {
3827 Item* bagItem = fullBag->GetItemByPos(i);
3828 if (!bagItem)
3829 continue;
3830
3831 ItemTemplate const* bagItemProto = bagItem->GetTemplate();
3832 if (!bagItemProto || !ItemCanGoIntoBag(bagItemProto, emptyProto))
3833 {
3834 // one from items not go to empty target bag
3836 return;
3837 }
3838
3839 ++count;
3840 }
3841
3842 if (count > emptyBag->GetBagSize())
3843 {
3844 // too small targeted bag
3846 return;
3847 }
3848
3849 // Items swap
3850 count = 0; // will pos in new bag
3851 for (uint32 i = 0; i < fullBag->GetBagSize(); ++i)
3852 {
3853 Item* bagItem = fullBag->GetItemByPos(i);
3854 if (!bagItem)
3855 continue;
3856
3857 fullBag->RemoveItem(i, true);
3858 emptyBag->StoreItem(count, bagItem, true);
3859 bagItem->SetState(ITEM_CHANGED, this);
3860
3861 ++count;
3862 }
3863 }
3864 }
3865 }
3866
3867 // now do moves, remove...
3868 RemoveItem(dstbag, dstslot, false, true);
3869 RemoveItem(srcbag, srcslot, false, true);
3870
3871 // add to dest
3872 if (IsInventoryPos(dst))
3873 StoreItem(sDest, pSrcItem, true);
3874 else if (IsBankPos(dst))
3875 BankItem(sDest, pSrcItem, true);
3876 else if (IsEquipmentPos(dst))
3877 EquipItem(eDest, pSrcItem, true);
3878
3879 // add to src
3880 if (IsInventoryPos(src))
3881 StoreItem(sDest2, pDstItem, true);
3882 else if (IsBankPos(src))
3883 BankItem(sDest2, pDstItem, true);
3884 else if (IsEquipmentPos(src))
3885 EquipItem(eDest2, pDstItem, true);
3886
3887 // Xinef: Call this here after all needed items are equipped
3889
3890 // if player is moving bags and is looting an item inside this bag
3891 // release the loot
3892 if (GetLootGUID())
3893 {
3894 bool released = false;
3895 if (IsBagPos(src))
3896 {
3897 Bag* bag = pSrcItem->ToBag();
3898 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3899 {
3900 if (Item* bagItem = bag->GetItemByPos(i))
3901 {
3902 // Xinef: Removed next loot generated check
3903 if (bagItem->GetGUID() == GetLootGUID())
3904 {
3906 released = true; // so we don't need to look at dstBag
3907 break;
3908 }
3909 }
3910 }
3911 }
3912
3913 if (!released && IsBagPos(dst))
3914 {
3915 Bag* bag = pDstItem->ToBag();
3916 for (uint32 i = 0; i < bag->GetBagSize(); ++i)
3917 {
3918 if (Item* bagItem = bag->GetItemByPos(i))
3919 {
3920 // Xinef: Removed next loot generated check
3921 if (bagItem->GetGUID() == GetLootGUID())
3922 {
3924 released = true; // not realy needed here
3925 break;
3926 }
3927 }
3928 }
3929 }
3930 }
3931
3933}
bool IsEmpty() const
Definition Bag.cpp:179
void RemoveItem(uint8 slot, bool update)
Definition Bag.cpp:143
void SendRefundInfo(Item *item)
Definition Player.cpp:15637

References ApplyEnchantment(), AutoUnequipOffhandIfNeed(), BankItem(), CanBankItem(), CanEquipItem(), CanStoreItem(), CanUnequipItem(), WorldSession::DoLootRelease(), EQUIP_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS, EQUIP_ERR_CANT_DO_RIGHT_NOW, EQUIP_ERR_ITEMS_CANT_BE_SWAPPED, EQUIP_ERR_NONEMPTY_BAG_OVER_OTHER_BAG, EQUIP_ERR_OK, EQUIP_ERR_YOU_ARE_DEAD, EquipItem(), Bag::GetBagSize(), Item::GetCount(), Object::GetEntry(), Object::GetGUID(), GetItemByPos(), Bag::GetItemByPos(), GetLootGUID(), ItemTemplate::GetMaxStackSize(), Item::GetTemplate(), Unit::IsAlive(), Item::IsBag(), IsBagPos(), IsBankPos(), Bag::IsEmpty(), IsEquipmentPos(), IsInventoryPos(), Object::IsInWorld(), Item::IsNotEmptyBag(), ITEM_CHANGED, ItemAddedQuestCheck(), ItemCanGoIntoBag(), ItemRemovedQuestCheck(), LOG_DEBUG, m_session, RemoveItem(), Bag::RemoveItem(), RemoveItemDependentAurasAndCasts(), SendEquipError(), SendRefundInfo(), Object::SendUpdateToPlayer(), Item::SetCount(), Item::SetState(), StoreItem(), Bag::StoreItem(), Item::ToBag(), and UpdateTitansGrip().

Referenced by WorldSession::HandleAutoEquipItemSlotOpcode(), WorldSession::HandleEquipmentSetUse(), item_commandscript::HandleItemMoveCommand(), WorldSession::HandleSwapInvItemOpcode(), and WorldSession::HandleSwapItem().

◆ SwapQuestSlot()

void Player::SwapQuestSlot ( uint16  slot1,
uint16  slot2 
)
inline
1505 {
1506 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
1507 {
1510
1513 }
1514 }

References Object::GetUInt32Value(), MAX_QUEST_OFFSET, PLAYER_QUEST_LOG_1_1, and Unit::SetUInt32Value().

Referenced by WorldSession::HandleQuestLogSwapQuest().

◆ TakeQuestSourceItem()

bool Player::TakeQuestSourceItem ( uint32  questId,
bool  msg 
)
1364{
1365 Quest const* quest = sObjectMgr->GetQuestTemplate(questId);
1366 if (quest)
1367 {
1368 uint32 srcItemId = quest->GetSrcItemId();
1369 ItemTemplate const* item = sObjectMgr->GetItemTemplate(srcItemId);
1370
1371 if (srcItemId > 0)
1372 {
1373 uint32 count = quest->GetSrcItemCount();
1374 if (count <= 0)
1375 count = 1;
1376
1377 // exist two cases when destroy source quest item not possible:
1378 // a) non un-equippable item (equipped non-empty bag, for example)
1379 // b) when quest is started from an item and item also is needed in
1380 // the end as RequiredItemId
1381 InventoryResult res = CanUnequipItems(srcItemId, count);
1382 if (res != EQUIP_ERR_OK)
1383 {
1384 if (msg)
1385 SendEquipError(res, nullptr, nullptr, srcItemId);
1386 return false;
1387 }
1388
1389 bool destroyItem = true;
1390 for (uint8 n = 0; n < QUEST_ITEM_OBJECTIVES_COUNT; ++n)
1391 if (item->StartQuest == questId && srcItemId == quest->RequiredItemId[n])
1392 destroyItem = false;
1393
1394 if (destroyItem)
1395 DestroyItemCount(srcItemId, count, true, true);
1396 }
1397 }
1398
1399 return true;
1400}
InventoryResult CanUnequipItems(uint32 item, uint32 count) const
Definition PlayerStorage.cpp:274
uint32 GetSrcItemCount() const
Definition QuestDef.h:259
uint32 GetSrcItemId() const
Definition QuestDef.h:258
uint32 StartQuest
Definition ItemTemplate.h:668

References CanUnequipItems(), DestroyItemCount(), EQUIP_ERR_OK, Quest::GetSrcItemCount(), Quest::GetSrcItemId(), QUEST_ITEM_OBJECTIVES_COUNT, Quest::RequiredItemId, SendEquipError(), sObjectMgr, and ItemTemplate::StartQuest.

Referenced by Spell::EffectQuestClear(), and WorldSession::HandleQuestLogRemoveQuest().

◆ TalkedToCreature()

void Player::TalkedToCreature ( uint32  entry,
ObjectGuid  guid 
)
2113{
2114 uint16 addTalkCount = 1;
2115 for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
2116 {
2117 uint32 questid = GetQuestSlotQuestId(i);
2118 if (!questid)
2119 continue;
2120
2121 Quest const* qInfo = sObjectMgr->GetQuestTemplate(questid);
2122 if (!qInfo)
2123 continue;
2124
2125 QuestStatusData& q_status = m_QuestStatus[questid];
2126
2127 if (q_status.Status == QUEST_STATUS_INCOMPLETE)
2128 {
2130 {
2131 for (uint8 j = 0; j < QUEST_OBJECTIVES_COUNT; ++j)
2132 {
2133 // skip Gameobject objectives
2134 if (qInfo->RequiredNpcOrGo[j] < 0)
2135 continue;
2136
2137 uint32 reqTarget = 0;
2138
2139 if (qInfo->RequiredNpcOrGo[j] > 0) // creature activate objectives
2140 // checked at quest_template loading
2141 reqTarget = qInfo->RequiredNpcOrGo[j];
2142 else
2143 continue;
2144
2145 if (reqTarget == entry)
2146 {
2147 uint32 reqTalkCount = qInfo->RequiredNpcOrGoCount[j];
2148 uint16 curTalkCount = q_status.CreatureOrGOCount[j];
2149 if (curTalkCount < reqTalkCount)
2150 {
2151 q_status.CreatureOrGOCount[j] = curTalkCount + addTalkCount;
2152
2153 m_QuestStatusSave[questid] = true;
2154
2155 SendQuestUpdateAddCreatureOrGo(qInfo, guid, j, curTalkCount, addTalkCount);
2156 }
2157 if (CanCompleteQuest(questid))
2158 CompleteQuest(questid);
2159 else
2161
2162 // same objective target can be in many active quests, but not in 2 objectives for single quest (code optimization).
2163 continue;
2164 }
2165 }
2166 }
2167 }
2168 }
2169}

References ADDITIONAL_SAVING_QUEST_STATUS, AdditionalSavingAddMask(), CanCompleteQuest(), CompleteQuest(), QuestStatusData::CreatureOrGOCount, GetQuestSlotQuestId(), Quest::HasSpecialFlag(), m_QuestStatus, m_QuestStatusSave, MAX_QUEST_LOG_SIZE, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_CAST, QUEST_SPECIAL_FLAGS_KILL, QUEST_SPECIAL_FLAGS_SPEAKTO, QUEST_STATUS_INCOMPLETE, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, SendQuestUpdateAddCreatureOrGo(), sObjectMgr, and QuestStatusData::Status.

Referenced by npc_aged_dying_ancient_kodo::OnGossipHello(), brann_bronzebeard::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_razael_and_lyana::OnGossipSelect(), and npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI().

◆ TeamIdForRace()

TeamId Player::TeamIdForRace ( uint8  race)
static
5850{
5851 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race))
5852 {
5853 switch (rEntry->TeamID)
5854 {
5855 case 1:
5856 return TEAM_HORDE;
5857 case 7:
5858 return TEAM_ALLIANCE;
5859 }
5860 LOG_ERROR("entities.player", "Race ({}) has wrong teamid ({}) in DBC: wrong DBC files?", uint32(race), rEntry->TeamID);
5861 }
5862 else
5863 LOG_ERROR("entities.player", "Race ({}) not found in DBC: wrong DBC files?", uint32(race));
5864
5865 return TEAM_ALLIANCE;
5866}

References LOG_ERROR, sChrRacesStore, TEAM_ALLIANCE, and TEAM_HORDE.

Referenced by CharacterCache::GetCharacterTeamByGuid(), Unit::GetModelForForm(), GetTeamId(), WorldSession::HandleAddFriendOpcode(), WorldSession::HandleCalendarEventInvite(), WorldSession::HandleCharCreateOpcode(), WorldSession::HandleCharFactionOrRaceChangeCallback(), WorldSession::HandleSendMail(), misc_commandscript::HandleSkirmishCommand(), PlayerTaxi::InitTaxiNodesForLevel(), Channel::KickOrBan(), AchievementMgr::LoadFromDB(), and SetFactionForRace().

◆ TeleportTo() [1/2]

bool Player::TeleportTo ( uint32  mapid,
float  x,
float  y,
float  z,
float  orientation,
uint32  options = 0,
Unit target = nullptr,
bool  newInstance = false 
)
1351{
1352 if (!MapMgr::IsValidMapCoord(mapid, x, y, z, orientation))
1353 {
1354 LOG_ERROR("entities.player", "TeleportTo: invalid map ({}) or invalid coordinates (X: {}, Y: {}, Z: {}, O: {}) given when teleporting player ({}, name: {}, map: {}, X: {}, Y: {}, Z: {}, O: {}).",
1355 mapid, x, y, z, orientation, GetGUID().ToString(), GetName(), GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
1356 return false;
1357 }
1358
1359 if (AccountMgr::IsPlayerAccount(GetSession()->GetSecurity()) && sDisableMgr->IsDisabledFor(DISABLE_TYPE_MAP, mapid, this))
1360 {
1361 LOG_ERROR("entities.player", "Player ({}, name: {}) tried to enter a forbidden map {}", GetGUID().ToString(), GetName(), mapid);
1363 return false;
1364 }
1365
1366 // preparing unsummon pet if lost (we must get pet before teleportation or will not find it later)
1367 Pet* pet = GetPet();
1368
1369 MapEntry const* mEntry = sMapStore.LookupEntry(mapid);
1370
1371 // don't let enter battlegrounds without assigned battleground id (for example through areatrigger)...
1372 if (!InBattleground() && mEntry->IsBattlegroundOrArena())
1373 return false;
1374
1375 // pussywizard: arena spectator, prevent teleporting from arena to instance/etc
1376 if (GetMapId() != mapid && IsSpectator() && mEntry->Instanceable())
1377 {
1379 return false;
1380 }
1381
1382 // client without expansion support
1383 if (GetSession()->Expansion() < mEntry->Expansion())
1384 {
1385 LOG_DEBUG("maps", "Player {} using client without required expansion tried teleport to non accessible map {}", GetName(), mapid);
1386
1387 if (GetTransport())
1388 {
1390 m_transport = nullptr;
1393 RepopAtGraveyard(); // teleport to near graveyard if on transport, looks blizz like :)
1394 }
1395
1397
1398 return false; // normal client can't teleport to this map...
1399 }
1400 else
1401 LOG_DEBUG("maps", "Player {} is being teleported to map {}", GetName(), mapid);
1402
1403 // xinef: do this here in case teleport failed in above checks
1404 if (!(options & TELE_TO_NOT_LEAVE_TAXI) && IsInFlight())
1405 {
1408 }
1409
1410 if (!(options & TELE_TO_NOT_LEAVE_VEHICLE) && m_vehicle)
1411 ExitVehicle();
1412
1413 // reset movement flags at teleport, because player will continue move with these flags after teleport
1415 DisableSpline();
1416
1417 // Xinef: Remove all movement imparing effects auras, skip small teleport like blink
1418 if (mapid != GetMapId() || GetDistance2d(x, y) > 100)
1419 {
1424 // remove auras that should be removed when being teleported
1426 }
1427
1428 if (m_transport)
1429 {
1430 if (options & TELE_TO_NOT_LEAVE_TRANSPORT)
1432 else
1433 {
1435 m_transport = nullptr;
1438 }
1439 }
1440
1441 // The player was ported to another map and loses the duel immediately.
1442 // We have to perform this check before the teleport, otherwise the
1443 // ObjectAccessor won't find the flag.
1446
1447 if (!sScriptMgr->OnPlayerBeforeTeleport(this, mapid, x, y, z, orientation, options, target))
1448 return false;
1449
1450 if (GetMapId() == mapid && !newInstance)
1451 {
1452 //lets reset far teleport flag if it wasn't reset during chained teleports
1454
1455 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1456 //if teleport spell is casted in Unit::Update() func
1457 //then we need to delay it until update process will be finished
1458 if (MustDelayTeleport())
1459 {
1462 //lets save teleport destination for player
1463 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1464 teleportStore_options = options;
1465 return true;
1466 }
1467
1468 if (options & TELE_TO_WITH_PET)
1470
1471 if (!(options & TELE_TO_NOT_UNSUMMON_PET))
1472 {
1473 //same map, only remove pet if out of range for new position
1474 if (pet && !pet->IsWithinDist3d(x, y, z, GetMap()->GetVisibilityRange()))
1476 }
1477
1478 if (!(options & TELE_TO_NOT_LEAVE_COMBAT))
1479 CombatStop();
1480
1481 // this will be used instead of the current location in SaveToDB
1482 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1484
1485 // code for finish transfer called in WorldSession::HandleMovementOpcodes()
1486 // at client packet MSG_MOVE_TELEPORT_ACK
1488 // near teleport, triggering send MSG_MOVE_TELEPORT_ACK from client at landing
1489 if (!GetSession()->PlayerLogout())
1490 {
1491 SetCanTeleport(true);
1492 Position oldPos = GetPosition();
1493 Relocate(x, y, z, orientation);
1495 SendTeleportPacket(oldPos); // this automatically relocates to oldPos in order to broadcast the packet in the right place
1496 }
1497 }
1498 else
1499 {
1501 {
1503 return false;
1504 }
1505
1506 // far teleport to another map
1507 Map* oldmap = IsInWorld() ? GetMap() : nullptr;
1508 // check if we can enter before stopping combat / removing pet / totems / interrupting spells
1509
1510 // Check enter rights before map getting to avoid creating instance copy for player
1511 // this check not dependent from map instance copy and same for all instance copies of selected map
1512 if (!(options & TELE_TO_GM_MODE) && sMapMgr->PlayerCannotEnter(mapid, this, false))
1513 return false;
1514
1515 // if PlayerCannotEnter -> CanEnter: checked above
1516 {
1517 //lets reset near teleport flag if it wasn't reset during chained teleports
1519
1520 SetHasDelayedTeleport(false); // pussywizard: current teleport cancels stored one
1521 //if teleport spell is casted in Unit::Update() func
1522 //then we need to delay it until update process will be finished
1523 if (MustDelayTeleport())
1524 {
1527 //lets save teleport destination for player
1528 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1529 teleportStore_options = options;
1530 return true;
1531 }
1532
1534
1535 CombatStop();
1536
1537 // remove pet on map change
1538 if (pet)
1540
1541 // remove all dyn objects
1543
1544 // stop spellcasting
1545 // not attempt interrupt teleportation spell at caster teleport
1546 if (!(options & TELE_TO_SPELL))
1547 if (IsNonMeleeSpellCast(true))
1549
1550 //remove auras before removing from map...
1552
1554
1555 if (!GetSession()->PlayerLogout())
1556 {
1557 // send transfer packets
1558 WorldPacket data(SMSG_TRANSFER_PENDING, 4 + 4 + 4);
1559 data << uint32(mapid);
1560 if (m_transport)
1561 data << m_transport->GetEntry() << GetMapId();
1562
1563 SendDirectMessage(&data);
1564 }
1565
1566 // remove from old map now
1567 if (oldmap)
1568 oldmap->RemovePlayerFromMap(this, false);
1569
1570 teleportStore_dest = WorldLocation(mapid, x, y, z, orientation);
1572 // if the player is saved before worldportack (at logout for example)
1573 // this will be used instead of the current location in SaveToDB
1574
1575 if (!GetSession()->PlayerLogout())
1576 {
1577 SetCanTeleport(true);
1578 WorldPacket data(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4);
1579 data << uint32(mapid);
1580 if (m_transport)
1582 else
1584
1585 SendDirectMessage(&data);
1587 }
1588
1589 // move packet sent by client always after far teleport
1590 // code for finish transfer to new map called in WorldSession::HandleMoveWorldportAckOpcode at client packet
1592 }
1593 }
1594 return true;
1595}
@ TELE_TO_WITH_PET
Definition Player.h:822
@ TELE_TO_NOT_LEAVE_TAXI
Definition Player.h:823
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:821
@ TELE_TO_SPELL
Definition Player.h:820
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:818
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:819
@ TELE_TO_GM_MODE
Definition Player.h:816
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:817
@ TRANSFER_ABORT_MAP_NOT_ALLOWED
Definition Player.h:793
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ AURA_INTERRUPT_FLAG_TELEPORTED
Definition SpellDefines.h:65
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
@ MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE
Movement flags that have change status opcodes associated for players.
Definition UnitDefines.h:420
@ CLASS_CONTEXT_TELEPORT
Definition UnitDefines.h:232
virtual void RemovePlayerFromMap(Player *, bool)
Definition Map.cpp:701
void SendTeleportAckPacket()
Definition Player.cpp:1340
void SetMapChangeOrderCounter()
Definition Player.h:2642
void SetSelection(ObjectGuid guid)
Used for serverside target changes, does not apply to players.
Definition Player.cpp:11565
void SendSavedInstances()
Definition PlayerStorage.cpp:6570
void SetSemaphoreTeleportNear(time_t tm)
Definition Player.h:2093
void SetHasDelayedTeleport(bool setting)
Definition Player.h:2963
void SetSemaphoreTeleportFar(time_t tm)
Definition Player.h:2094
bool MustDelayTeleport() const
Definition Player.h:2960
void CleanupAfterTaxiFlight()
Definition Player.cpp:10460
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
uint32 GetUnitMovementFlags() const
Definition Unit.h:760
Vehicle * m_vehicle
Definition Unit.h:2154
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:19765
void SetUnitMovementFlags(uint32 f)
Definition Unit.h:761
void RemoveAllDynObjects()
Definition Unit.cpp:6262
bool IsWithinDist3d(float x, float y, float z, float dist) const
Definition Object.cpp:1328
float GetDistance2d(WorldObject const *obj) const
Definition Object.cpp:1296
@ SMSG_NEW_WORLD
Definition Opcodes.h:92
@ SMSG_TRANSFER_PENDING
Definition Opcodes.h:93
Position GetPosition() const
Definition Position.h:147
Position::PositionXYZOStreamer PositionXYZOStream()
Definition Position.h:154

References Unit::AddUnitMovementFlag(), AURA_INTERRUPT_FLAG_CHANGE_MAP, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TELEPORTED, AURA_INTERRUPT_FLAG_TURNING, CLASS_CONTEXT_TELEPORT, CLASS_DEATH_KNIGHT, CleanupAfterTaxiFlight(), Unit::CombatStop(), DISABLE_TYPE_MAP, Unit::DisableSpline(), duel, DUEL_FLED, DuelComplete(), ObjectGuid::Empty, Unit::ExitVehicle(), MapEntry::Expansion(), WorldObject::GetDistance2d(), Object::GetEntry(), Unit::GetGameObject(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGuidValue(), WorldObject::GetMap(), WorldLocation::GetMapId(), Unit::GetMotionMaster(), WorldObject::GetName(), Position::GetOrientation(), GetPet(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetSession(), WorldObject::GetTransport(), Unit::GetUnitMovementFlags(), WorldObject::GetVisibilityRange(), HasSpell(), InBattleground(), MapEntry::Instanceable(), Unit::InterruptNonMeleeSpells(), MapEntry::IsBattlegroundOrArena(), IsClass(), IsGameMaster(), Unit::IsInFlight(), Object::IsInWorld(), Unit::IsNonMeleeSpellCast(), AccountMgr::IsPlayerAccount(), IsSpectator(), MapMgr::IsValidMapCoord(), WorldObject::IsWithinDist3d(), LOG_DEBUG, LOG_ERROR, WorldObject::m_movementInfo, WorldObject::m_transport, Unit::m_vehicle, MAP_EBON_HOLD, MotionMaster::MovementExpired(), MOVEMENTFLAG_MASK_HAS_PLAYER_STATUS_OPCODE, MOVEMENTFLAG_ONTRANSPORT, MustDelayTeleport(), PLAYER_DUEL_ARBITER, MovementInfo::TransportInfo::pos, Position::PositionXYZOStream(), Position::Relocate(), Unit::RemoveAllDynObjects(), Unit::RemoveAurasByType(), Unit::RemoveAurasWithInterruptFlags(), MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), Map::RemovePlayerFromMap(), RepopAtGraveyard(), MovementInfo::TransportInfo::Reset(), sDisableMgr, SendDirectMessage(), SendSavedInstances(), SendTeleportAckPacket(), Unit::SendTeleportPacket(), SendTransferAborted(), SetCanTeleport(), SetFallInformation(), SetHasDelayedTeleport(), SetMapChangeOrderCounter(), SetSelection(), SetSemaphoreTeleportFar(), SetSemaphoreTeleportNear(), Unit::SetUnitMovementFlags(), sMapMgr, sMapStore, SMSG_NEW_WORLD, SMSG_TRANSFER_PENDING, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, sScriptMgr, TELE_TO_GM_MODE, TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TAXI, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, teleportStore_dest, teleportStore_options, Position::ToString(), TRANSFER_ABORT_INSUF_EXPAN_LVL, TRANSFER_ABORT_MAP_NOT_ALLOWED, TRANSFER_ABORT_UNIQUE_MESSAGE, MovementInfo::transport, and UnsummonPetTemporaryIfAny().

Referenced by ActivateTaxiPathTo(), BattlegroundSA::CaptureGraveyard(), BattlegroundSA::DefendersPortalTeleport(), MotionTransport::DelayedTeleportTransport(), BattlegroundIC::DoAction(), go_commandscript::DoTeleport(), Spell::EffectTeleportUnits(), misc_commandscript::HandleAppearCommand(), WorldSession::HandleAreaTriggerOpcode(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleHearthAndResurrect(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveWorldportAck(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleWorldTeleportOpcode(), Unit::NearTeleportTo(), npc_wg_spirit_guide::OnGossipSelect(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), at_orb_of_command::OnTrigger(), at_icc_saurfang_portal::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_last_rites::OnTrigger(), Battlefield::PlayerAskToLeave(), BfGraveyard::RelocateDeadPlayers(), Battleground::RelocateDeadPlayers(), Map::RemoveAllPlayers(), RepopAtGraveyard(), ResurectUsingRequestData(), WorldSession::SendSpiritResurrect(), BattlegroundMgr::SendToBattleground(), SummonIfPossible(), lfg::LFGMgr::TeleportPlayer(), GmTicket::TeleportTo(), TeleportTo(), BattlegroundSA::TeleportToEntrancePosition(), TeleportToEntryPoint(), Update(), and GameObject::Use().

◆ TeleportTo() [2/2]

bool Player::TeleportTo ( WorldLocation const &  loc,
uint32  options = 0,
Unit target = nullptr 
)
inline
1094 {
1095 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
1096 }

References WorldLocation::GetMapId(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and TeleportTo().

◆ TeleportToEntryPoint()

◆ TextEmote() [1/2]

void Player::TextEmote ( std::string_view  text,
WorldObject const *  = nullptr,
bool  = false 
)
overridevirtual

Outputs an universal text which is supposed to be an action.

Reimplemented from Unit.

9460{
9461 std::string _text(text);
9462
9463 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text))
9464 {
9465 return;
9466 }
9467
9468 sScriptMgr->OnPlayerChat(this, CHAT_MSG_EMOTE, LANG_UNIVERSAL, _text);
9469
9470 WorldPacket data;
9472
9473 SendDirectMessage(&data);
9474
9475 // Special handling for messages, do not use visibility map for stealthed units
9476 Acore::MessageDistDeliverer notifier(this, &data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), !sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE), nullptr, true);
9477 Cell::VisitObjects(this, notifier, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE));
9478}
@ CHAT_MSG_EMOTE
Definition SharedDefines.h:3412
@ LANG_UNIVERSAL
Definition SharedDefines.h:746
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE
Definition WorldConfig.h:118
@ CONFIG_LISTEN_RANGE_TEXTEMOTE
Definition WorldConfig.h:151

References ChatHandler::BuildChatPacket(), CHAT_MSG_EMOTE, CONFIG_ALLOW_TWO_SIDE_INTERACTION_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, LANG_UNIVERSAL, SendDirectMessage(), sScriptMgr, sWorld, and Cell::VisitObjects().

Referenced by WorldSession::HandleMessagechatOpcode().

◆ TextEmote() [2/2]

void Player::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
overridevirtual

Reimplemented from Unit.

9481{
9482 Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
9483}

References CHAT_MSG_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToggleAFK()

void Player::ToggleAFK ( )
1309{
1311
1312 // afk player not allowed in battleground
1313 if (!IsGameMaster() && isAFK() && InBattleground())
1315}
void ToggleFlag(uint16 index, uint32 flag)
Definition Object.cpp:866
void LeaveBattleground(Battleground *bg=nullptr)
Definition Player.cpp:11340

References InBattleground(), isAFK(), IsGameMaster(), LeaveBattleground(), PLAYER_FLAGS, PLAYER_FLAGS_AFK, and Object::ToggleFlag().

Referenced by Battleground::AddPlayer(), WorldSession::HandleMessagechatOpcode(), Battlefield::PlayerAcceptInviteToWar(), and Unit::SetCharmedBy().

◆ ToggleDND()

void Player::ToggleDND ( )

◆ ToggleInstantFlight()

void Player::ToggleInstantFlight ( )

References m_isInstantFlightOn.

Referenced by OnGossipSelect().

◆ ToggleMetaGemsActive()

void Player::ToggleMetaGemsActive ( uint8  exceptslot,
bool  apply 
)
11271{
11272 //cycle all equipped items
11273 for (int slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
11274 {
11275 //enchants for the slot being socketed are handled by WorldSession::HandleSocketOpcode(WorldPacket& recvData)
11276 if (slot == exceptslot)
11277 continue;
11278
11279 Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot);
11280
11281 if (!pItem || !pItem->GetTemplate()->Socket[0].Color) //if item has no sockets or no item is equipped go to next item
11282 continue;
11283
11284 //cycle all (gem)enchants
11285 for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + 3; ++enchant_slot)
11286 {
11287 uint32 enchant_id = pItem->GetEnchantmentId(EnchantmentSlot(enchant_slot));
11288 if (!enchant_id) //if no enchant go to next enchant(slot)
11289 continue;
11290
11291 SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
11292 if (!enchantEntry)
11293 continue;
11294
11295 //only metagems to be (de)activated, so only enchants with condition
11296 uint32 condition = enchantEntry->EnchantmentCondition;
11297 if (condition)
11298 ApplyEnchantment(pItem, EnchantmentSlot(enchant_slot), apply);
11299 }
11300 }
11301}

References ApplyEnchantment(), _Socket::Color, SpellItemEnchantmentEntry::EnchantmentCondition, EQUIPMENT_SLOT_END, EQUIPMENT_SLOT_START, Item::GetEnchantmentId(), GetItemByPos(), Item::GetTemplate(), INVENTORY_SLOT_BAG_0, SOCK_ENCHANTMENT_SLOT, ItemTemplate::Socket, and sSpellItemEnchantmentStore.

Referenced by WorldSession::HandleSocketOpcode().

◆ TradeCancel()

void Player::TradeCancel ( bool  sendback,
TradeStatus  status = TRADE_STATUS_TRADE_CANCELED 
)
4088{
4089 if (m_trade)
4090 {
4091 Player* trader = m_trade->GetTrader();
4092
4093 // send yellow "Trade canceled" message to both traders
4094 if (sendback)
4095 GetSession()->SendCancelTrade(status);
4096
4097 trader->GetSession()->SendCancelTrade(status);
4098
4099 // cleanup
4100 delete m_trade;
4101 m_trade = nullptr;
4102 delete trader->m_trade;
4103 trader->m_trade = nullptr;
4104 }
4105}
void SendCancelTrade(TradeStatus status)
Definition TradeHandler.cpp:527

References GetSession(), TradeData::GetTrader(), m_trade, and WorldSession::SendCancelTrade().

Referenced by ActivateTaxiPathTo(), CleanupsBeforeDelete(), WorldSession::HandleBusyTradeOpcode(), WorldSession::HandleCancelTradeOpcode(), WorldSession::HandleIgnoreTradeOpcode(), and WorldSession::HandleSocketClosed().

◆ UninviteFromGroup()

void Player::UninviteFromGroup ( )
  • If the player is invited, remove him. If the group if then only 1 person, disband the group.
2316{
2317 Group* group = GetGroupInvite();
2318 if (!group)
2319 return;
2320
2321 group->RemoveInvite(this);
2322
2323 if (group->IsCreated())
2324 {
2325 if (group->GetMembersCount() <= 1) // group has just 1 member => disband
2326 {
2327 group->Disband(true);
2328 group = nullptr; // gets deleted in disband
2329 }
2330 }
2331 else
2332 {
2333 if (group->GetInviteeCount() <= 1)
2334 {
2335 group->RemoveAllInvites();
2336 delete group;
2337 group = nullptr;
2338 }
2339 }
2340}
bool IsCreated() const
Definition Group.cpp:2296
void RemoveAllInvites()
Definition Group.cpp:361
void Disband(bool hideDestroy=false)
Definition Group.cpp:753
void RemoveInvite(Player *player)
Definition Group.cpp:351
uint32 GetInviteeCount() const
Definition Group.h:246
Group * GetGroupInvite()
Definition Player.h:2470

References Group::Disband(), GetGroupInvite(), Group::GetInviteeCount(), Group::GetMembersCount(), Group::IsCreated(), Group::RemoveAllInvites(), and Group::RemoveInvite().

Referenced by WorldSession::HandleGroupDeclineOpcode(), and WorldSession::LogoutPlayer().

◆ UnsummonPetTemporaryIfAny()

void Player::UnsummonPetTemporaryIfAny ( )

◆ Update()

void Player::Update ( uint32  time)
overridevirtual
Todo:
add weapon, skill check

Reimplemented from WorldObject.

54{
55 if (!IsInWorld())
56 return;
57
58 sScriptMgr->OnPlayerBeforeUpdate(this, p_time);
59
60 // undelivered mail
62 {
65
66 // It will be recalculate at mailbox open (for unReadMails important
67 // non-0 until mailbox open, it also will be recalculated)
68 m_nextMailDelivereTime = time_t(0);
69 }
70
71 // Update cinematic location, if 500ms have passed and we're doing a
72 // cinematic now.
75 {
78 }
79
80 // used to implement delayed far teleports
83 Unit::Update(p_time);
85
86 time_t now = GameTime::GetGameTime().count();
87
88 UpdatePvPFlag(now);
90
91 UpdateContestedPvP(p_time);
92
93 UpdateDuelFlag(now);
94
96
97 UpdateAfkReport(now);
98
99 // Xinef: update charm AI only if we are controlled by creature or
100 // non-posses player charm
102 {
103 m_charmUpdateTimer += p_time;
104 if (m_charmUpdateTimer >= 1000)
105 {
107 if (Unit* charmer = GetCharmer())
108 if (charmer->IsAlive())
110 }
111 }
112
113 time_t lastTick = m_Last_tick;
114 if (now > m_Last_tick)
115 {
116 // Update items that have just a limited lifetime
118
119 // check every minute, less chance to crash and wont break anything.
121
122 // Played time
123 uint32 elapsed = uint32(now - m_Last_tick);
124 m_Played_time[PLAYED_TIME_TOTAL] += elapsed; // Total played time
125 m_Played_time[PLAYED_TIME_LEVEL] += elapsed; // Level played time
126 GetSession()->SetTotalTime(GetSession()->GetTotalTime() + elapsed);
127 m_Last_tick = now;
128 }
129
130 // If mute expired, remove it from the DB
131 if (GetSession()->m_muteTime && GetSession()->m_muteTime < now)
132 {
133 GetSession()->m_muteTime = 0;
135 LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME);
136 stmt->SetData(0, 0); // Set the mute time to 0
137 stmt->SetData(1, "");
138 stmt->SetData(2, "");
139 stmt->SetData(3, GetSession()->GetAccountId());
140 LoginDatabase.Execute(stmt);
141 }
142
143 if (!m_timedquests.empty())
144 {
145 QuestSet::iterator iter = m_timedquests.begin();
146 while (iter != m_timedquests.end())
147 {
148 QuestStatusData& q_status = m_QuestStatus[*iter];
149 if (q_status.Timer <= p_time)
150 {
151 uint32 quest_id = *iter;
152 ++iter; // current iter will be removed in FailQuest
153 FailQuest(quest_id);
154 }
155 else
156 {
157 q_status.Timer -= p_time;
158 m_QuestStatusSave[*iter] = true;
159 ++iter;
160 }
161 }
162 }
163
164 m_achievementMgr->Update(p_time);
165
167 {
168 if (Unit* victim = GetVictim())
169 {
170 // default combat reach 10
172
174 {
175 if (!IsWithinMeleeRange(victim))
176 {
178 if (m_swingErrorMsg != 1) // send single time (client auto repeat)
179 {
181 m_swingErrorMsg = 1;
182 }
183 }
184 // 120 degrees of radiant range, if player is not in boundary radius
185 else if (!IsWithinBoundaryRadius(victim) && !HasInArc(2 * float(M_PI) / 3, victim))
186 {
188 if (m_swingErrorMsg != 2) // send single time (client auto repeat)
189 {
191 m_swingErrorMsg = 2;
192 }
193 }
194 else
195 {
196 m_swingErrorMsg = 0; // reset swing error state
197
198 // prevent base and off attack in same time, delay attack at
199 // 0.2 sec
203
204 // do attack
207 }
208 }
209
211 {
212 if (!IsWithinMeleeRange(victim))
214 else if (!IsWithinBoundaryRadius(victim) && !HasInArc(2 * float(M_PI) / 3, victim))
216 else
217 {
218 // prevent base and off attack in same time, delay attack at
219 // 0.2 sec
222
223 // do attack
226 }
227 }
228
229 /*Unit* owner = victim->GetOwner();
230 Unit* u = owner ? owner : victim;
231 if (u->IsPvP() && (!duel || duel->opponent != u))
232 {
233 UpdatePvP(true);
234 RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
235 }*/
236 }
237 }
238
240 {
241 if (now > lastTick && _restTime > 0) // freeze update
242 {
243 time_t currTime = GameTime::GetGameTime().count();
244 time_t timeDiff = currTime - _restTime;
245 if (timeDiff >= 10) // freeze update
246 {
247 _restTime = currTime;
248
249 float bubble = 0.125f * sWorld->getRate(RATE_REST_INGAME);
250 float extraPerSec =
251 ((float) GetUInt32Value(PLAYER_NEXT_LEVEL_XP) / 72000.0f) *
252 bubble;
253
254 // speed collect rest bonus (section/in hour)
255 SetRestBonus(GetRestBonus() + timeDiff * extraPerSec);
256 }
257 }
258 }
259
260 if (m_weaponChangeTimer > 0)
261 {
262 if (p_time >= m_weaponChangeTimer)
264 else
265 m_weaponChangeTimer -= p_time;
266 }
267
268 if (!IsPositionValid()) // pussywizard: will crash below at eg. GetZoneAndAreaId
269 {
270 LOG_INFO("misc", "Player::Update - invalid position ({:0.1f}, {:0.1f}, {:0.1f})! Map: {}, MapId: {}, {}",
272 GetSession()->KickPlayer("Invalid position");
273 return;
274 }
275
276 if (m_zoneUpdateTimer > 0)
277 {
278 if (p_time >= m_zoneUpdateTimer)
279 {
280 // On zone update tick check if we are still in an inn if we are
281 // supposed to be in one
283 {
284 AreaTrigger const* atEntry = sObjectMgr->GetAreaTrigger(GetInnTriggerId());
285 if (!atEntry || !IsInAreaTriggerRadius(atEntry, 5.f))
286 {
288 }
289 }
290
291 uint32 newzone, newarea;
292 GetZoneAndAreaId(newzone, newarea);
293
294 if (m_zoneUpdateId != newzone)
295 UpdateZone(newzone, newarea); // also update area
296 else
297 {
298 // use area updates as well
299 // needed for free far all arenas for example
300 if (m_areaUpdateId != newarea)
301 UpdateArea(newarea);
302 }
303
305 }
306 else
307 m_zoneUpdateTimer -= p_time;
308 }
309
310 sScriptMgr->OnPlayerUpdate(this, p_time);
311
312 if (IsAlive())
313 {
314 m_regenTimer += p_time;
316 }
317
319 KillPlayer();
320
321 if (m_nextSave)
322 {
323 if (p_time >= m_nextSave)
324 {
325 // m_nextSave reset in SaveToDB call
326 SaveToDB(false, false);
327 LOG_DEBUG("entities.player", "Player::Update: Player '{}' ({}) saved", GetName(), GetGUID().ToString());
328 }
329 else
330 {
331 m_nextSave -= p_time;
332 }
333 }
334
335 // Handle Water/drowning
336 HandleDrowning(p_time);
337
338 if (GetDrunkValue())
339 {
340 m_drunkTimer += p_time;
343 }
344
345 if (HasPendingBind())
346 {
347 if (_pendingBindTimer <= p_time)
348 {
349 // Player left the instance
352 SetPendingBind(0, 0);
353 }
354 else
355 _pendingBindTimer -= p_time;
356 }
357
358 // not auto-free ghost from body in instances
359 if (m_deathTimer > 0 && !GetMap()->Instanceable() &&
361 {
362 if (p_time >= m_deathTimer)
363 {
364 m_deathTimer = 0;
367 }
368 else
369 m_deathTimer -= p_time;
370 }
371
372 UpdateEnchantTime(p_time);
373 UpdateHomebindTime(p_time);
374
375 if (!_instanceResetTimes.empty())
376 {
377 for (InstanceTimeMap::iterator itr = _instanceResetTimes.begin();
378 itr != _instanceResetTimes.end();)
379 {
380 if (itr->second < now)
381 _instanceResetTimes.erase(itr++);
382 else
383 ++itr;
384 }
385 }
386
387 // group update
389
390 Pet* pet = GetPet();
391 if (pet && !pet->IsWithinDistInMap(this, GetMap()->GetVisibilityRange()) &&
392 !pet->isPossessed())
393 // if (pet && !pet->IsWithinDistInMap(this,
394 // GetMap()->GetVisibilityDistance()) && (GetCharmGUID() &&
395 // (pet->GetGUID()
396 // != GetCharmGUID())))
398
399 // pussywizard:
400 if (m_hostileReferenceCheckTimer <= p_time)
401 {
403 if (!GetMap()->IsDungeon())
406 }
407 else
409
410 // we should execute delayed teleports only for alive(!) players
411 // because we don't want player's ghost teleported from graveyard
412 // xinef: so we store it to the end of the world and teleport out of the ass
413 // after resurrection?
414 if (HasDelayedTeleport() /* && IsAlive()*/)
415 {
418 }
419
421 {
423 UpdateObjectVisibility(true, true);
426 }
427}
constexpr auto CINEMATIC_UPDATEDIFF
Definition CinematicMgr.h:26
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition DatabaseEnv.cpp:22
@ LOGIN_UPD_MUTE_TIME
Definition LoginDatabase.h:72
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:70
constexpr auto ZONE_UPDATE_INTERVAL
Definition PlayerUpdates.cpp:51
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
@ UNIT_STATE_CHARGING
Definition UnitDefines.h:187
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:278
#define ATTACK_DISPLAY_DELAY
Definition Unit.h:622
@ RATE_REST_INGAME
Definition WorldConfig.h:462
void Update(uint32 timeDiff)
Definition AchievementMgr.cpp:2183
std::vector< FlyByCamera > const * m_cinematicCamera
Definition CinematicMgr.h:56
uint32 m_cinematicDiff
Definition CinematicMgr.h:52
uint32 m_lastCinematicCheck
Definition CinematicMgr.h:53
uint32 m_activeCinematicCameraId
Definition CinematicMgr.h:54
void UpdateCinematicLocation(uint32 diff)
Definition CinematicMgr.cpp:92
void deleteReferencesOutOfRange(float range)
Definition HostileRefMgr.cpp:199
void UpdateEnchantTime(uint32 time)
Definition PlayerStorage.cpp:4161
uint32 GetInnTriggerId() const
Definition Player.h:1206
void UpdateContestedPvP(uint32 currTime)
Definition PlayerMisc.cpp:360
void SendAttackSwingBadFacingAttack()
Definition PlayerMisc.cpp:146
void SendUpdateToOutOfRangeGroupMembers()
Definition Player.cpp:11754
void KillPlayer()
Definition Player.cpp:4570
void UpdateDuelFlag(time_t currTime)
Definition PlayerMisc.cpp:423
bool HasRestFlag(RestFlag restFlag) const
Definition Player.h:1203
bool HasDelayedTeleport() const
Definition Player.h:2962
void SendAttackSwingNotInRange()
Definition PlayerMisc.cpp:78
void UpdateSoulboundTradeItems()
Definition PlayerStorage.cpp:4107
void RemoveRestFlag(RestFlag restFlag)
Definition Player.cpp:16180
void CheckDuelDistance(time_t currTime)
Definition Player.cpp:6395
void UpdatePvPFlag(time_t currTime)
Definition PlayerMisc.cpp:372
void HandleSobering()
The player sobers by 1% every 9 seconds.
Definition Player.cpp:965
void UpdateFFAPvPFlag(time_t currTime)
Definition PlayerMisc.cpp:391
void BindToInstance()
Definition PlayerStorage.cpp:6521
void FailQuest(uint32 quest_id)
Definition PlayerQuest.cpp:886
void ProcessSpellQueue()
Definition PlayerUpdates.cpp:2359
void HandleDrowning(uint32 time_diff)
Definition Player.cpp:848
void UpdateCharmedAI()
Definition PlayerUpdates.cpp:1940
void UpdateHomebindTime(uint32 time)
Definition PlayerUpdates.cpp:1393
bool IsInAreaTriggerRadius(AreaTrigger const *trigger, float delta=0.f) const
Definition Player.cpp:2182
void RegenerateAll()
Definition Player.cpp:1753
void UpdateAfkReport(time_t currTime)
checks the 15 afk reports per 5 minutes limit
Definition PlayerMisc.cpp:351
bool HasOffhandWeaponForAttack() const
Definition Unit.h:968
bool IsCharmed() const
Definition Unit.h:1277
bool IsWithinBoundaryRadius(const Unit *obj) const
Definition Unit.cpp:704
Unit * GetCharmer() const
Definition Unit.cpp:10684
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:868
bool IsWithinMeleeRange(Unit const *obj, float dist=0.f) const
Definition Unit.cpp:665
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2068
bool isPossessed() const
Definition Unit.h:1278
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2600
void Update(uint32 time) override
Definition Unit.cpp:383
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:870
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:871
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:643
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2066
void RemoveFromNotify(uint16 f)
Definition Object.h:659
void SetTotalTime(uint32 TotalTime)
Definition WorldSession.h:437
void KickPlayer(bool setKicked=true)
Definition WorldSession.h:462
Definition ObjectMgr.h:420
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:148

References _cinematicMgr, _instanceResetTimes, _pendingBindId, _pendingBindTimer, _restTime, ATTACK_DISPLAY_DELAY, Unit::AttackerStateUpdate(), BASE_ATTACK, BindToInstance(), Unit::bRequestForcedVisibilityUpdate, BuildPlayerRepop(), CheckDuelDistance(), CINEMATIC_UPDATEDIFF, HostileRefMgr::deleteReferencesOutOfRange(), FailQuest(), WorldObject::FindMap(), Unit::getAttackTimer(), Unit::GetCharmer(), GetDrunkValue(), GameTime::GetGameTime(), Object::GetGUID(), Unit::getHostileRefMgr(), GetInnTriggerId(), WorldObject::GetInstanceId(), WorldObject::GetMap(), WorldLocation::GetMapId(), getMSTime(), GetMSTimeDiffToNow(), WorldObject::GetName(), GetPet(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetRestBonus(), GetSession(), Object::GetUInt32Value(), Unit::GetVictim(), WorldObject::GetVisibilityRange(), WorldObject::GetZoneAndAreaId(), HandleDrowning(), HandleSobering(), HasDelayedTeleport(), Position::HasInArc(), Unit::HasOffhandWeaponForAttack(), HasPendingBind(), HasPlayerFlag(), Unit::HasPreventResurectionAura(), HasRestFlag(), Unit::HasUnitFlag(), Unit::HasUnitState(), IN_MILLISECONDS, Unit::IsAlive(), Unit::isAttackReady(), IsBeingTeleported(), Unit::IsCharmed(), IsInAreaTriggerRadius(), Object::IsInWorld(), Position::IsPositionValid(), Unit::isPossessed(), Unit::IsWithinBoundaryRadius(), WorldObject::IsWithinDistInMap(), Unit::IsWithinMeleeRange(), JustDied, WorldSession::KickPlayer(), KillPlayer(), LOG_DEBUG, LOG_INFO, LOGIN_UPD_MUTE_TIME, LoginDatabase, m_achievementMgr, CinematicMgr::m_activeCinematicCameraId, m_areaUpdateId, m_charmUpdateTimer, CinematicMgr::m_cinematicCamera, CinematicMgr::m_cinematicDiff, Unit::m_deathState, m_deathTimer, Unit::m_delayed_unit_relocation_timer, m_drunkTimer, m_hostileReferenceCheckTimer, m_Last_tick, CinematicMgr::m_lastCinematicCheck, WorldSession::m_muteTime, m_nextMailDelivereTime, m_nextSave, m_Played_time, m_QuestStatus, m_QuestStatusSave, Unit::m_regenTimer, m_swingErrorMsg, m_timedquests, m_weaponChangeTimer, m_zoneUpdateId, m_zoneUpdateTimer, NOTIFY_VISIBILITY_CHANGED, OFF_ATTACK, PET_SAVE_NOT_IN_SLOT, PLAYED_TIME_LEVEL, PLAYED_TIME_TOTAL, PLAYER_FLAGS_RESTING, PLAYER_NEXT_LEVEL_XP, ProcessSpellQueue(), RATE_REST_INGAME, RegenerateAll(), WorldObject::RemoveFromNotify(), RemovePet(), RemoveRestFlag(), RepopAtGraveyard(), Unit::resetAttackTimer(), REST_FLAG_IN_TAVERN, SaveToDB(), SendAttackSwingBadFacingAttack(), SendAttackSwingNotInRange(), SendNewMail(), SendUpdateToOutOfRangeGroupMembers(), Unit::setAttackTimer(), PreparedStatementBase::SetData(), SetHasDelayedTeleport(), SetMustDelayTeleport(), SetPendingBind(), SetRestBonus(), WorldSession::SetTotalTime(), sObjectMgr, sScriptMgr, sWorld, teleportStore_dest, teleportStore_options, TeleportTo(), QuestStatusData::Timer, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_POSSESSED, UNIT_STATE_CASTING, UNIT_STATE_CHARGING, UNIT_STATE_MELEE_ATTACKING, unReadMails, Unit::Update(), AchievementMgr::Update(), UpdateAfkReport(), UpdateArea(), UpdateCharmedAI(), CinematicMgr::UpdateCinematicLocation(), UpdateContestedPvP(), UpdateDuelFlag(), UpdateEnchantTime(), UpdateFFAPvPFlag(), UpdateHomebindTime(), UpdateItemDuration(), UpdateObjectVisibility(), UpdatePvPFlag(), UpdateSoulboundTradeItems(), UpdateZone(), and ZONE_UPDATE_INTERVAL.

Referenced by Map::Update().

◆ UpdateAchievementCriteria()

void Player::UpdateAchievementCriteria ( AchievementCriteriaTypes  type,
uint32  miscValue1 = 0,
uint32  miscValue2 = 0,
Unit unit = nullptr 
)
2164{
2165 m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2,
2166 unit);
2167}
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition AchievementMgr.cpp:817

References m_achievementMgr, and AchievementMgr::UpdateAchievementCriteria().

Referenced by _addSpell(), Spell::_cast(), KillRewarder::_RewardKillCredit(), ActivateTaxiPathTo(), CheckAreaExploreAndOutdoor(), Group::CountTheRoll(), Unit::DealDamage(), Spell::DoSpellHitOnUnit(), FlightPathMovementGenerator::DoUpdate(), InstanceScript::DoUpdateAchievementCriteria(), DuelComplete(), EnvironmentalDamage(), EquipItem(), EquipNewItem(), lfg::LFGMgr::FinishDungeon(), GiveLevel(), WorldSession::HandleAlterAppearance(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleBuyBankSlotOpcode(), HandleFall(), WorldSession::HandleGameobjectReportUse(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleLootRoll(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandleQuestLogRemoveQuest(), reset_commandscript::HandleResetHonorCommand(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSendMail(), WorldSession::HandleTextEmoteOpcode(), Unit::Kill(), KilledMonsterCredit(), ArenaTeamMember::ModifyPersonalRating(), MoveItemToInventory(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), InstanceSaveMgr::PlayerBindToInstance(), QuickEquipItem(), resetTalents(), RewardHonor(), RewardQuest(), AuctionHouseMgr::SendAuctionSuccessfulMail(), AuctionHouseMgr::SendAuctionWonMail(), setDeathState(), SetMoney(), ReputationMgr::SetOneFactionReputation(), SetSkill(), SetTitle(), StoreNewItem(), SummonIfPossible(), UpdateLootAchievements(), BattlegroundAB::UpdatePlayerScore(), BattlegroundAV::UpdatePlayerScore(), BattlegroundEY::UpdatePlayerScore(), BattlegroundIC::UpdatePlayerScore(), BattlegroundWS::UpdatePlayerScore(), UpdateSkill(), UpdateSkillPro(), and GameObject::Use().

◆ UpdateAfkReport()

void Player::UpdateAfkReport ( time_t  currTime)

checks the 15 afk reports per 5 minutes limit

352{
353 if (m_bgData.bgAfkReportedTimer <= currTime)
354 {
356 m_bgData.bgAfkReportedTimer = currTime + 5 * MINUTE;
357 }
358}
time_t bgAfkReportedTimer
Definition Player.h:1039

References BGData::bgAfkReportedCount, BGData::bgAfkReportedTimer, m_bgData, and MINUTE.

Referenced by Update().

◆ UpdateAllCritPercentages()

void Player::UpdateAllCritPercentages ( )

◆ UpdateAllRatings()

void Player::UpdateAllRatings ( )
703{
704 for (int cr = 0; cr < MAX_COMBAT_RATING; ++cr)
706}
CombatRating
Definition Unit.h:218

References MAX_COMBAT_RATING, and UpdateRating().

Referenced by UpdateAllStats().

◆ UpdateAllSpellCritChances()

void Player::UpdateAllSpellCritChances ( )
889{
890 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
892}
@ SPELL_SCHOOL_NORMAL
Definition SharedDefines.h:294
void UpdateSpellCritChance(uint32 school)
Definition StatSystem.cpp:839

References MAX_SPELL_SCHOOL, SPELL_SCHOOL_NORMAL, and UpdateSpellCritChance().

Referenced by AuraEffect::HandleAuraModCritPct(), AuraEffect::HandleModSpellCritChance(), UpdateAllStats(), UpdateRating(), and UpdateStats().

◆ UpdateAllStats()

bool Player::UpdateAllStats ( )
overridevirtual

Implements Unit.

206{
207 for (int8 i = STAT_STRENGTH; i < MAX_STATS; ++i)
208 {
209 float value = GetTotalStatValue(Stats(i));
210 SetStat(Stats(i), int32(value));
211 }
212
213 UpdateArmor();
214 // calls UpdateAttackPowerAndDamage() in UpdateArmor for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
217
218 for (uint8 i = POWER_MANA; i < MAX_POWERS; ++i)
220
232
233 return true;
234}
void UpdateAllSpellCritChances()
Definition StatSystem.cpp:888
void UpdateArmor() override
Definition StatSystem.cpp:269
void UpdateSpellDamageAndHealingBonus()
Definition StatSystem.cpp:194
void UpdateMaxHealth() override
Definition StatSystem.cpp:313
void UpdateAllRatings()
Definition PlayerUpdates.cpp:702
void UpdateAllCritPercentages()
Definition StatSystem.cpp:697
void UpdateDefenseBonusesMod()
Definition StatSystem.cpp:626
virtual void UpdateAllResistances()
Definition StatSystem.cpp:54
float GetTotalStatValue(Stats stat, float additionalValue=0.0f) const
Definition Unit.cpp:15331

References BASE_ATTACK, CR_ARMOR_PENETRATION, Unit::GetTotalStatValue(), MAX_POWERS, MAX_STATS, OFF_ATTACK, POWER_MANA, RecalculateRating(), Unit::SetStat(), STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllRatings(), Unit::UpdateAllResistances(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDefenseBonusesMod(), UpdateExpertise(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

Referenced by _ApplyAllStatBonuses(), _RemoveAllStatBonuses(), Create(), GiveLevel(), and LoadFromDB().

◆ UpdateArea()

void Player::UpdateArea ( uint32  newArea)
1216{
1217 // pussywizard: inform instance, needed for Icecrown Citadel
1218 if (InstanceScript* instance = GetInstanceScript())
1219 instance->OnPlayerAreaUpdate(this, m_areaUpdateId, newArea);
1220
1221 sScriptMgr->OnPlayerUpdateArea(this, m_areaUpdateId, newArea);
1222
1223 // FFA_PVP flags are area and not zone id dependent
1224 // so apply them accordingly
1225 m_areaUpdateId = newArea;
1226
1227 AreaTableEntry const* area = sAreaTableStore.LookupEntry(newArea);
1228 pvpInfo.IsInFFAPvPArea = area && (area->flags & AREA_FLAG_ARENA);
1229 UpdateFFAPvPState(false);
1230
1231 UpdateAreaDependentAuras(newArea);
1232
1233 pvpInfo.IsInNoPvPArea = false;
1234 if (area && area->IsSanctuary())
1235 {
1237 pvpInfo.IsInNoPvPArea = true;
1239 }
1240 else
1242
1243 uint32 const areaRestFlag = (GetTeamId(true) == TEAM_ALLIANCE)
1246 if (area && area->flags & areaRestFlag)
1248 else
1250}
@ AREA_FLAG_ARENA
Definition DBCEnums.h:241
@ AREA_FLAG_REST_ZONE_HORDE
Definition DBCEnums.h:256
@ AREA_FLAG_REST_ZONE_ALLIANCE
Definition DBCEnums.h:257
@ REST_FLAG_IN_FACTION_AREA
Definition Player.h:811
void UpdateFFAPvPState(bool reset=true)
Definition PlayerUpdates.cpp:1453
bool IsSanctuary() const
Definition DBCStructure.h:533
bool IsInNoPvPArea
‍Marks if player is in an area which forces PvP flag
Definition Player.h:358
bool IsInFFAPvPArea
‍Marks if player is in a sanctuary or friendly capital city
Definition Player.h:359

References AREA_FLAG_ARENA, AREA_FLAG_REST_ZONE_ALLIANCE, AREA_FLAG_REST_ZONE_HORDE, Unit::CombatStopWithPets(), AreaTableEntry::flags, WorldObject::GetInstanceScript(), GetTeamId(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_areaUpdateId, pvpInfo, Object::RemoveByteFlag(), RemoveRestFlag(), REST_FLAG_IN_FACTION_AREA, sAreaTableStore, Object::SetByteFlag(), SetRestFlag(), sScriptMgr, TEAM_ALLIANCE, UNIT_BYTE2_FLAG_SANCTUARY, UNIT_FIELD_BYTES_2, UpdateAreaDependentAuras(), and UpdateFFAPvPState().

Referenced by SetGameMaster(), Update(), and UpdateZone().

◆ UpdateAreaDependentAuras()

void Player::UpdateAreaDependentAuras ( uint32  area_id)
1854{
1855 // remove auras from spells with area limitations
1856 for (AuraMap::iterator iter = m_ownedAuras.begin();
1857 iter != m_ownedAuras.end();)
1858 {
1859 // use m_zoneUpdateId for speed: UpdateArea called from UpdateZone or
1860 // instead UpdateZone in both cases m_zoneUpdateId up-to-date
1861 if (iter->second->GetSpellInfo()->CheckLocation(
1862 GetMapId(), m_zoneUpdateId, newArea, this, false) !=
1864 RemoveOwnedAura(iter);
1865 else
1866 ++iter;
1867 }
1868
1869 // Xinef: check controlled auras
1870 if (!m_Controlled.empty())
1871 for (ControlSet::iterator itr = m_Controlled.begin();
1872 itr != m_Controlled.end();)
1873 {
1874 Unit* controlled = *itr;
1875 ++itr;
1876 if (controlled && !controlled->IsPet())
1877 {
1878 Unit::AuraMap& tAuras = controlled->GetOwnedAuras();
1879 for (Unit::AuraMap::iterator auraIter = tAuras.begin();
1880 auraIter != tAuras.end();)
1881 {
1882 if (auraIter->second->GetSpellInfo()->CheckLocation(
1883 GetMapId(), m_zoneUpdateId, newArea, nullptr) !=
1885 controlled->RemoveOwnedAura(auraIter);
1886 else
1887 ++auraIter;
1888 }
1889 }
1890 }
1891
1892 // some auras applied at subzone enter
1893 SpellAreaForAreaMapBounds saBounds =
1894 sSpellMgr->GetSpellAreaForAreaMapBounds(newArea);
1895 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1896 itr != saBounds.second; ++itr)
1897 if (itr->second->autocast &&
1898 itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea))
1899 if (!HasAura(itr->second->spellId))
1900 CastSpell(this, itr->second->spellId, true);
1901
1902 if (newArea == 4273 && GetVehicle() && GetPositionX() > 400) // Ulduar
1903 {
1904 switch (GetVehicleBase()->GetEntry())
1905 {
1906 case 33062:
1907 case 33109:
1908 case 33060:
1909 GetVehicle()->Dismiss();
1910 break;
1911 }
1912 }
1913}
std::pair< SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator > SpellAreaForAreaMapBounds
Definition SpellMgr.h:550
Unit * GetVehicleBase() const
Definition Unit.cpp:18773
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:655
AuraMap & GetOwnedAuras()
Definition Unit.h:1336
void Dismiss()
Definition Vehicle.cpp:541

References Unit::CastSpell(), Vehicle::Dismiss(), Object::GetEntry(), WorldLocation::GetMapId(), Unit::GetOwnedAuras(), Position::GetPositionX(), Unit::GetVehicle(), Unit::GetVehicleBase(), Unit::HasAura(), Unit::IsPet(), Unit::m_Controlled, Unit::m_ownedAuras, m_zoneUpdateId, Unit::RemoveOwnedAura(), SPELL_CAST_OK, and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::SetData(), and UpdateArea().

◆ UpdateArmor()

void Player::UpdateArmor ( )
overridevirtual

Implements Unit.

270{
271 UnitMods unitMod = UNIT_MOD_ARMOR;
272
273 float value = GetModifierValue(unitMod, BASE_VALUE); // base armor (from items)
274 value *= GetModifierValue(unitMod, BASE_PCT); // armor percent from items
275 value += GetStat(STAT_AGILITY) * 2.0f; // armor bonus from stats
276 value += GetModifierValue(unitMod, TOTAL_VALUE);
277
278 //add dynamic flat mods
280 for (AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
281 {
282 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
283 value += CalculatePct(GetStat(Stats((*i)->GetMiscValueB())), (*i)->GetAmount());
284 }
285
286 value *= GetModifierValue(unitMod, TOTAL_PCT);
287
288 SetArmor(int32(value));
289
290 UpdateAttackPowerAndDamage(); // armor dependent auras update for SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
291}
@ SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:245

References BASE_PCT, BASE_VALUE, CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetArmor(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_MASK_NORMAL, STAT_AGILITY, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, and UpdateAttackPowerAndDamage().

Referenced by UpdateAllStats(), UpdateResistances(), and UpdateStats().

◆ UpdateArmorPenetration()

void Player::UpdateArmorPenetration ( int32  amount)
865{
866 // Store Rating Value
868}

References CR_ARMOR_PENETRATION, PLAYER_FIELD_COMBAT_RATING_1, and Unit::SetUInt32Value().

Referenced by UpdateRating().

◆ UpdateAttackPowerAndDamage()

void Player::UpdateAttackPowerAndDamage ( bool  ranged = false)
overridevirtual

Implements Unit.

348{
349 float val2 = 0.0f;
350 float level = float(GetLevel());
351
352 sScriptMgr->OnPlayerBeforeUpdateAttackPowerAndDamage(this, level, val2, ranged);
353
355
359
360 if (ranged)
361 {
365
367 {
368 val2 = level * 2.0f + GetStat(STAT_AGILITY) - 10.0f;
369 }
371 {
372 val2 = level + GetStat(STAT_AGILITY) - 10.0f;
373 }
375 {
376 switch (GetShapeshiftForm())
377 {
378 case FORM_CAT:
379 case FORM_BEAR:
380 case FORM_DIREBEAR:
381 val2 = 0.0f;
382 break;
383 default:
384 val2 = GetStat(STAT_AGILITY) - 10.0f;
385 break;
386 }
387 }
388 else
389 {
390 val2 = GetStat(STAT_AGILITY) - 10.0f;
391 }
392 }
393 else
394 {
396 {
397 val2 = level * 3.0f + GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
398 }
400 {
401 val2 = level * 2.0f + GetStat(STAT_STRENGTH) + GetStat(STAT_AGILITY) - 20.0f;
402 }
404 {
405 // Check if Predatory Strikes is skilled
406 float mLevelMult = 0.0f;
407 float weapon_bonus = 0.0f;
408 if (IsInFeralForm())
409 {
411 for (Unit::AuraEffectList::const_iterator itr = mDummy.begin(); itr != mDummy.end(); ++itr)
412 {
413 AuraEffect* aurEff = *itr;
414 if (aurEff->GetSpellInfo()->SpellIconID == 1563)
415 {
416 switch (aurEff->GetEffIndex())
417 {
418 case 0: // Predatory Strikes (effect 0)
419 mLevelMult = CalculatePct(1.0f, aurEff->GetAmount());
420 break;
421 case 1: // Predatory Strikes (effect 1)
422 if (Item* mainHand = m_items[EQUIPMENT_SLOT_MAINHAND])
423 {
424 // also gains % attack power from equipped weapon
425 ItemTemplate const* proto = mainHand->GetTemplate();
426 if (!proto)
427 continue;
428
429 uint32 ap = proto->getFeralBonus();
430 // Get AP Bonuses from weapon
431 for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
432 {
433 if (i >= proto->StatsCount)
434 break;
435
437 ap += proto->ItemStat[i].ItemStatValue;
438 }
439
440 // Get AP Bonuses from weapon spells
441 for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
442 {
443 // no spell
444 if (!proto->Spells[i].SpellId || proto->Spells[i].SpellTrigger != ITEM_SPELLTRIGGER_ON_EQUIP)
445 continue;
446
447 // check if it is valid spell
448 SpellInfo const* spellproto = sSpellMgr->GetSpellInfo(proto->Spells[i].SpellId);
449 if (!spellproto)
450 continue;
451
452 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
453 if (spellproto->Effects[j].ApplyAuraName == SPELL_AURA_MOD_ATTACK_POWER)
454 ap += spellproto->Effects[j].CalcValue();
455 }
456
457 weapon_bonus = CalculatePct(float(ap), aurEff->GetAmount());
458 }
459 break;
460 default:
461 break;
462 }
463 }
464 }
465 }
466
467 switch (GetShapeshiftForm())
468 {
469 case FORM_CAT:
470 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f + GetStat(STAT_AGILITY) - 20.0f + weapon_bonus + m_baseFeralAP;
471 break;
472 case FORM_BEAR:
473 case FORM_DIREBEAR:
474 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + weapon_bonus + m_baseFeralAP;
475 break;
476 case FORM_MOONKIN:
477 val2 = (GetLevel() * mLevelMult) + GetStat(STAT_STRENGTH) * 2.0f - 20.0f + m_baseFeralAP;
478 break;
479 default:
480 val2 = GetStat(STAT_STRENGTH) * 2.0f - 20.0f;
481 break;
482 }
483 }
485 {
486 val2 = GetStat(STAT_STRENGTH) - 10.0f;
487 }
488 }
489
490 SetModifierValue(unitMod, BASE_VALUE, val2);
491
492 float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT);
493 float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE);
494
495 //add dynamic flat mods
496 if (ranged)
497 {
498 if ((getClassMask() & CLASSMASK_WAND_USERS) == 0)
499 {
501 for (AuraEffectList::const_iterator i = mRAPbyStat.begin(); i != mRAPbyStat.end(); ++i)
502 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
503 }
504 }
505 else
506 {
508 for (AuraEffectList::const_iterator i = mAPbyStat.begin(); i != mAPbyStat.end(); ++i)
509 attPowerMod += CalculatePct(GetStat(Stats((*i)->GetMiscValue())), (*i)->GetAmount());
510
512 for (AuraEffectList::const_iterator iter = mAPbyArmor.begin(); iter != mAPbyArmor.end(); ++iter)
513 // always: ((*i)->GetModifier()->m_miscvalue == 1 == SPELL_SCHOOL_MASK_NORMAL)
514 attPowerMod += int32(GetArmor() / (*iter)->GetAmount());
515 }
516
517 float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f;
518
519 sScriptMgr->OnPlayerAfterUpdateAttackPowerAndDamage(this, level, base_attPower, attPowerMod, attPowerMultiplier, ranged);
520 SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field
521 SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MODS field
522 SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
523
524 //automatically update weapon damage after attack power modification
525 if (ranged)
526 {
528 }
529 else
530 {
532 if (CanDualWield() && HasOffhandWeaponForAttack()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
536 }
537}
@ SPELL_AURA_MOD_ATTACK_POWER
Definition SpellAuraDefines.h:162
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT
Definition SpellAuraDefines.h:275
@ SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR
Definition SpellAuraDefines.h:348
@ SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT
Definition SpellAuraDefines.h:331
@ FORM_MOONKIN
Definition UnitDefines.h:98
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
Definition Unit.h:1054
_ItemStat ItemStat[MAX_ITEM_PROTO_STATS]
Definition ItemTemplate.h:648
int32 getFeralBonus(int32 extraDPS=0) const
Definition ItemTemplate.h:742
uint32 StatsCount
Definition ItemTemplate.h:647
int32 ItemStatValue
Definition ItemTemplate.h:587
uint32 ItemStatType
Definition ItemTemplate.h:586

References BASE_ATTACK, BASE_PCT, BASE_VALUE, CalculatePct(), Unit::CanDualWield(), CLASS_CONTEXT_STATS, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CLASSMASK_WAND_USERS, SpellInfo::Effects, EQUIPMENT_SLOT_MAINHAND, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, AuraEffect::GetAmount(), Unit::GetArmor(), Unit::GetAuraEffectsByType(), Unit::getClassMask(), AuraEffect::GetEffIndex(), ItemTemplate::getFeralBonus(), Unit::GetLevel(), Unit::GetModifierValue(), Unit::GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Unit::GetStat(), Unit::HasOffhandWeaponForAttack(), IsClass(), Unit::IsInFeralForm(), ITEM_MOD_ATTACK_POWER, ITEM_SPELLTRIGGER_ON_EQUIP, ItemTemplate::ItemStat, _ItemStat::ItemStatType, _ItemStat::ItemStatValue, m_baseFeralAP, m_items, MAX_ITEM_PROTO_SPELLS, MAX_ITEM_PROTO_STATS, MAX_SPELL_EFFECTS, OFF_ATTACK, RANGED_ATTACK, Object::SetFloatValue(), Object::SetInt32Value(), Unit::SetModifierValue(), SPELL_AURA_DUMMY, SPELL_AURA_MOD_ATTACK_POWER, SPELL_AURA_MOD_ATTACK_POWER_OF_ARMOR, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SpellInfo::SpellIconID, _Spell::SpellId, ItemTemplate::Spells, _Spell::SpellTrigger, sScriptMgr, sSpellMgr, STAT_AGILITY, STAT_STRENGTH, ItemTemplate::StatsCount, TOTAL_PCT, TOTAL_VALUE, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, Unit::UpdateDamagePhysical(), and UpdateSpellDamageAndHealingBonus().

Referenced by ApplyFeralAPBonus(), AuraEffect::HandleAuraModAttackPowerOfArmor(), AuraEffect::HandleAuraModRangedAttackPowerOfStatPercent(), InitDataForForm(), UpdateAllStats(), UpdateArmor(), and UpdateStats().

◆ UpdateBlockPercentage()

void Player::UpdateBlockPercentage ( )
634{
635 // No block
636 float value = 0.0f;
637 if (CanBlock())
638 {
639 // Base value
640 value = 5.0f;
641 // Modify value from defense skill
642 value += (int32(GetDefenseSkillValue()) - int32(GetMaxSkillValueForLevel())) * 0.04f;
643 // Increase from SPELL_AURA_MOD_BLOCK_PERCENT aura
645 // Increase from rating
647
648 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
649 {
650 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Block", 95.0f) : value;
651 }
652
653 value = value < 0.0f ? 0.0f : value;
654 }
656}
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:779
bool CanBlock() const
Definition Player.h:2185
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3662
#define sConfigMgr
Definition Config.h:93

References CanBlock(), CR_BLOCK, Unit::GetDefenseSkillValue(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), Unit::GetTotalAuraModifier(), PLAYER_BLOCK_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), and SPELL_AURA_MOD_BLOCK_PERCENT.

Referenced by AuraEffect::HandleAuraModBlockPercent(), SetCanBlock(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdateCharmedAI()

void Player::UpdateCharmedAI ( )
private
1941{
1942 // Xinef: maybe passed as argument?
1943 Unit* charmer = GetCharmer();
1944 CharmInfo* charmInfo = GetCharmInfo();
1945
1946 // Xinef: needs more thinking, maybe kill player?
1947 if (!charmer || !charmInfo)
1948 return;
1949
1950 // Xinef: we should be killed if caster enters evade mode and charm is
1951 // infinite
1952 if (charmer->IsCreature() &&
1953 charmer->ToCreature()->IsInEvadeMode())
1954 {
1955 AuraEffectList const& auras =
1957 for (AuraEffectList::const_iterator iter = auras.begin();
1958 iter != auras.end(); ++iter)
1959 if ((*iter)->GetCasterGUID() == charmer->GetGUID() &&
1960 (*iter)->GetBase()->IsPermanent())
1961 {
1962 Unit::DealDamage(charmer, this, GetHealth(), nullptr,
1964 nullptr, false);
1965 return;
1966 }
1967 }
1968
1969 Unit* target = GetVictim();
1970 if (target)
1971 SetInFront(target);
1972
1974 return;
1975
1976 bool Mages =
1977 getClassMask() & (1 << (CLASS_MAGE - 1) | 1 << (CLASS_WARLOCK - 1) |
1978 1 << (CLASS_DRUID - 1) | 1 << (CLASS_HUNTER - 1) |
1979 1 << (CLASS_PRIEST - 1));
1980
1981 // Xinef: charmer type specific actions
1982 if (charmer->IsPlayer())
1983 {
1984 bool follow = false;
1985 if (!target)
1986 {
1987 if (charmInfo->GetPlayerReactState() == REACT_PASSIVE)
1988 follow = true;
1989 else if (charmInfo->GetPlayerReactState() == REACT_DEFENSIVE)
1990 {
1991 if (charmer->GetVictim())
1992 target = charmer->GetVictim();
1993 else
1994 follow = true;
1995 }
1996
1997 if (follow)
1998 {
2002 return;
2003 }
2004 }
2005 else if (target &&
2008 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
2009 }
2010
2011 if (!target || !IsValidAttackTarget(target))
2012 {
2013 target = SelectNearbyTarget(nullptr, GetMap()->IsDungeon() ? 100.f : 30.f);
2014 if (!target)
2015 {
2019
2020 return;
2021 }
2022
2023 GetMotionMaster()->MoveChase(target, Mages ? 15 : 4);
2024 Attack(target, true);
2025 }
2026 else
2027 {
2028 float Distance = GetDistance(target);
2029 uint8 rnd = urand(0, 1);
2030
2031 if (Mages)
2032 {
2033 if ((GetPower(POWER_MANA) * 100 / GetMaxPower(POWER_MANA)) < 10)
2034 {
2035 GetMotionMaster()->MoveChase(target, 4);
2036 return;
2037 }
2038
2039 if (Distance <= 3)
2040 {
2041 if (urand(0, 1))
2042 {
2045 CastSpell(target, m_charmAISpells[SPELL_T_STUN], false);
2050 false);
2051 else if (m_charmAISpells[SPELL_IMMUNITY] &&
2054 }
2055 else
2056 {
2057 switch (urand(0, 1))
2058 {
2059 case 0:
2063 CastSpell(
2064 target,
2066 false);
2067 break;
2068 case 1:
2073 false);
2074 break;
2075 }
2076 }
2077 }
2078 else
2079 {
2080 switch (urand(0, 2))
2081 {
2082 case 0:
2086 CastSpell(target,
2088 false);
2089 break;
2090 case 1:
2094 CastSpell(target,
2096 false);
2097 break;
2098 case 2:
2102 false);
2103 break;
2104 }
2105 }
2106 }
2107 else
2108 {
2109 if (Distance > 10)
2110 {
2111 GetMotionMaster()->MoveChase(target, 2.0f);
2114 CastSpell(target, m_charmAISpells[SPELL_T_CHARGE], false);
2115 else if (m_charmAISpells[SPELL_FAST_RUN] &&
2118 }
2119
2121 return;
2122
2123 switch (urand(0, 2))
2124 {
2125 case 0:
2129 CastSpell(target,
2131 false);
2132 break;
2133 case 1:
2138 false);
2139 break;
2140 case 2:
2144 break;
2145 }
2146 }
2147 }
2148}
@ CHASE_MOTION_TYPE
Definition MotionMaster.h:45
constexpr float PET_FOLLOW_ANGLE
Definition PetDefines.h:207
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ SPELL_HIGH_DAMAGE1
Definition Player.h:914
@ UNIT_STATE_FOLLOW
Definition UnitDefines.h:179
@ REACT_DEFENSIVE
Definition Unit.h:551
@ REACT_PASSIVE
Definition Unit.h:550
bool IsInEvadeMode() const
Definition Creature.h:139
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:314
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:949
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:446
Unit * SelectNearbyTarget(Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
Definition Unit.cpp:17010
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10323
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:13959
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20274
ReactStates GetPlayerReactState() const
Definition CharmInfo.h:184

References Unit::Attack(), Unit::CastSpell(), CHASE_MOTION_TYPE, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PRIEST, CLASS_WARLOCK, Unit::DealDamage(), DIRECT_DAMAGE, Unit::GetAuraEffectsByType(), Unit::GetCharmer(), Unit::GetCharmInfo(), Unit::getClassMask(), MotionMaster::GetCurrentMovementGeneratorType(), WorldObject::GetDistance(), Object::GetGUID(), Unit::GetHealth(), WorldObject::GetMap(), Unit::GetMaxPower(), Unit::GetMotionMaster(), CharmInfo::GetPlayerReactState(), Unit::GetPower(), Unit::GetVictim(), HasSpellCooldown(), Unit::HasUnitState(), Object::IsCreature(), Creature::IsInEvadeMode(), Object::IsPlayer(), Unit::IsValidAttackTarget(), m_charmAISpells, MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_ANGLE, PET_FOLLOW_DIST, POWER_MANA, REACT_DEFENSIVE, REACT_PASSIVE, Unit::SelectNearbyTarget(), Unit::SetInFront(), SPELL_AURA_MOD_CHARM, SPELL_DOT_DAMAGE, SPELL_FAST_RUN, SPELL_HIGH_DAMAGE1, SPELL_IMMUNITY, SPELL_INSTANT_DAMAGE, SPELL_ROOT_OR_FEAR, SPELL_SCHOOL_MASK_NORMAL, SPELL_T_CHARGE, SPELL_T_STUN, Object::ToCreature(), UNIT_STATE_CASTING, UNIT_STATE_FOLLOW, and urand().

Referenced by Update().

◆ UpdateCombatSkills()

void Player::UpdateCombatSkills ( Unit victim,
WeaponAttackType  attType,
bool  defence,
Item item = nullptr 
)
1026{
1027 uint8 playerLevel = GetLevel();
1028 uint16 currentSkillValue = defence ? GetBaseDefenseSkillValue() : GetBaseWeaponSkillValue(attType);
1029 uint16 currentSkillMax = 5 * playerLevel;
1030 int32 skillDiff = currentSkillMax - currentSkillValue;
1031
1032 // Max skill reached for level.
1033 // Can in some cases be less than 0: having max skill and then .level -1 as example.
1034 if (skillDiff <= 0)
1035 {
1036 return;
1037 }
1038
1039 uint8 greylevel = Acore::XP::GetGrayLevel(playerLevel);
1040 uint8 moblevel = defence ? victim->getLevelForTarget(this) : victim->GetLevel(); // if defense than victim == attacker
1041 /*if (moblevel < greylevel)
1042 return;*/
1043 // Patch 3.0.8 (2009-01-20): You can no longer skill up weapons on mobs that are immune to damage.
1044
1045 if (moblevel > playerLevel + 5)
1046 {
1047 moblevel = playerLevel + 5;
1048 }
1049
1050 int16 lvldif = moblevel - greylevel;
1051 if (lvldif < 3)
1052 {
1053 lvldif = 3;
1054 }
1055
1056 float chance = float(3 * lvldif * skillDiff) / playerLevel;
1057 if (!defence)
1058 {
1059 chance += chance * 0.02f * GetStat(STAT_INTELLECT);
1060 }
1061
1062 chance = chance < 1.0f ? 1.0f : chance; // minimum chance to increase skill is 1%
1063
1064 LOG_DEBUG("entities.player", "Player::UpdateCombatSkills(defence:{}, playerLevel:{}, moblevel:{}) -> ({}/{}) chance to increase skill is {}%", defence, playerLevel, moblevel, currentSkillValue, currentSkillMax, chance);
1065
1066 if (roll_chance_f(chance))
1067 {
1068 if (defence)
1069 {
1070 UpdateDefense();
1071 }
1072 else
1073 {
1074 UpdateWeaponSkill(victim, attType, item);
1075 }
1076 }
1077}
uint32 GetBaseDefenseSkillValue() const
Definition Player.h:1930
uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const
Definition Player.cpp:12859
void UpdateDefense()
Definition PlayerUpdates.cpp:603
void UpdateWeaponSkill(Unit *victim, WeaponAttackType attType, Item *item=nullptr)
Definition PlayerUpdates.cpp:981
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1066

References GetBaseDefenseSkillValue(), GetBaseWeaponSkillValue(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), Unit::getLevelForTarget(), Unit::GetStat(), LOG_DEBUG, roll_chance_f(), STAT_INTELLECT, UpdateDefense(), and UpdateWeaponSkill().

Referenced by Unit::ProcDamageAndSpellFor().

◆ UpdateContestedPvP()

void Player::UpdateContestedPvP ( uint32  currTime)
361{
363 return;
364 if (m_contestedPvPTimer <= diff)
365 {
367 }
368 else
369 m_contestedPvPTimer -= diff;
370}

References Unit::IsInCombat(), m_contestedPvPTimer, and ResetContestedPvP().

Referenced by Update().

◆ UpdateCorpseReclaimDelay()

void Player::UpdateCorpseReclaimDelay ( )
1916{
1918
1919 if ((pvp &&
1921 (!pvp && !sWorld->getBoolConfig(CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE)))
1922 return;
1923
1924 time_t now = GameTime::GetGameTime().count();
1925
1926 if (now < m_deathExpireTime)
1927 {
1928 // full and partly periods 1..3
1929 uint64 count = (m_deathExpireTime - now) / DEATH_EXPIRE_STEP + 1;
1930
1931 if (count < MAX_DEATH_COUNT)
1932 m_deathExpireTime = now + (count + 1) * DEATH_EXPIRE_STEP;
1933 else
1935 }
1936 else
1938}

References CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVE, CONFIG_DEATH_CORPSE_RECLAIM_DELAY_PVP, DEATH_EXPIRE_STEP, GameTime::GetGameTime(), m_deathExpireTime, m_ExtraFlags, MAX_DEATH_COUNT, PLAYER_EXTRA_PVP_DEATH, and sWorld.

Referenced by KillPlayer().

◆ UpdateCraftSkill()

bool Player::UpdateCraftSkill ( uint32  spellid)
825{
826 LOG_DEBUG("entities.player.skills", "UpdateCraftSkill spellid {}", spellid);
827
828 SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellid);
829
830 for (SkillLineAbilityMap::const_iterator _spell_idx = bounds.first;
831 _spell_idx != bounds.second; ++_spell_idx)
832 {
833 if (_spell_idx->second->SkillLine)
834 {
835 uint32 SkillValue =
836 GetPureSkillValue(_spell_idx->second->SkillLine);
837
838 // Alchemy Discoveries here
839 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
840 if (spellInfo && spellInfo->Mechanic == MECHANIC_DISCOVERY)
841 {
842 if (uint32 discoveredSpell = GetSkillDiscoverySpell(
843 _spell_idx->second->SkillLine, spellid, this))
844 learnSpell(discoveredSpell);
845 }
846
847 uint32 craft_skill_gain =
848 sWorld->getIntConfig(CONFIG_SKILL_GAIN_CRAFTING);
849 sScriptMgr->OnPlayerUpdateCraftingSkill(this, _spell_idx->second, SkillValue, craft_skill_gain);
850
851 return UpdateSkillPro(
852 _spell_idx->second->SkillLine,
853 SkillGainChance(SkillValue,
854 _spell_idx->second->TrivialSkillLineRankHigh,
855 (_spell_idx->second->TrivialSkillLineRankHigh +
856 _spell_idx->second->TrivialSkillLineRankLow) /
857 2,
858 _spell_idx->second->TrivialSkillLineRankLow),
859 craft_skill_gain);
860 }
861 }
862 return false;
863}
int SkillGainChance(uint32 SkillValue, uint32 GrayLevel, uint32 GreenLevel, uint32 YellowLevel)
Definition PlayerUpdates.cpp:750
@ MECHANIC_DISCOVERY
Definition SharedDefines.h:1364
uint32 GetSkillDiscoverySpell(uint32 skillId, uint32 spellId, Player *player)
Definition SkillDiscovery.cpp:213
@ CONFIG_SKILL_GAIN_CRAFTING
Definition WorldConfig.h:223
bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step)
Definition PlayerUpdates.cpp:913
uint32 Mechanic
Definition SpellInfo.h:323

References CONFIG_SKILL_GAIN_CRAFTING, GetPureSkillValue(), GetSkillDiscoverySpell(), learnSpell(), LOG_DEBUG, SpellInfo::Mechanic, MECHANIC_DISCOVERY, SkillGainChance(), sScriptMgr, sSpellMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::DoCreateItem(), Spell::EffectEnchantItemPerm(), and spell_gen_profession_research::HandleScript().

◆ UpdateCritPercentage()

void Player::UpdateCritPercentage ( WeaponAttackType  attType)
659{
660 BaseModGroup modGroup;
661 uint16 index;
662 CombatRating cr;
663
664 switch (attType)
665 {
666 case OFF_ATTACK:
667 modGroup = OFFHAND_CRIT_PERCENTAGE;
669 cr = CR_CRIT_MELEE;
670 break;
671 case RANGED_ATTACK:
672 modGroup = RANGED_CRIT_PERCENTAGE;
674 cr = CR_CRIT_RANGED;
675 break;
676 case BASE_ATTACK:
677 default:
678 modGroup = CRIT_PERCENTAGE;
680 cr = CR_CRIT_MELEE;
681 break;
682 }
683
684 float value = GetTotalPercentageModValue(modGroup) + GetRatingBonusValue(cr);
685 // Modify crit from weapon skill and maximized defense skill of same level victim difference
686 value += (int32(GetWeaponSkillValue(attType)) - int32(GetMaxSkillValueForLevel())) * 0.04f;
687
688 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
689 {
690 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Crit", 95.0f) : value;
691 }
692
693 value = value < 0.0f ? 0.0f : value;
694 SetStatFloatValue(index, value);
695}
float GetTotalPercentageModValue(BaseModGroup modGroup) const
Definition Player.h:2196
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3827

References BASE_ATTACK, CR_CRIT_MELEE, CR_CRIT_RANGED, CRIT_PERCENTAGE, GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetTotalPercentageModValue(), Unit::GetWeaponSkillValue(), OFF_ATTACK, OFFHAND_CRIT_PERCENTAGE, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, RANGED_CRIT_PERCENTAGE, sConfigMgr, and Object::SetStatFloatValue().

Referenced by HandleBaseModValue(), UpdateAllCritPercentages(), and UpdateRating().

◆ UpdateDefense()

void Player::UpdateDefense ( )
604{
606 sWorld->getIntConfig(CONFIG_SKILL_GAIN_DEFENSE)))
607 UpdateDefenseBonusesMod(); // update dependent from defense skill part
608}
@ CONFIG_SKILL_GAIN_DEFENSE
Definition WorldConfig.h:224
bool UpdateSkill(uint32 skill_id, uint32 step)
Definition PlayerUpdates.cpp:709

References CONFIG_SKILL_GAIN_DEFENSE, SKILL_DEFENSE, sWorld, UpdateDefenseBonusesMod(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateDefenseBonusesMod()

void Player::UpdateDefenseBonusesMod ( )

◆ UpdateDodgePercentage()

void Player::UpdateDodgePercentage ( )
799{
800 const float dodge_cap[MAX_CLASSES] =
801 {
802 88.129021f, // Warrior
803 88.129021f, // Paladin
804 145.560408f, // Hunter
805 145.560408f, // Rogue
806 150.375940f, // Priest
807 88.129021f, // DK
808 145.560408f, // Shaman
809 150.375940f, // Mage
810 150.375940f, // Warlock
811 0.0f, // ??
812 116.890707f // Druid
813 };
814
815 float diminishing = 0.0f, nondiminishing = 0.0f;
816 GetDodgeFromAgility(diminishing, nondiminishing);
817 // Modify value from defense skill (only bonus from defense rating diminishes)
818 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
819 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
820 // Dodge from SPELL_AURA_MOD_DODGE_PERCENT aura
822 // Dodge from rating
823 diminishing += GetRatingBonusValue(CR_DODGE);
824 // apply diminishing formula to diminishing dodge chance
825 uint32 pclass = getClass() - 1;
826 m_realDodge = nondiminishing + (diminishing * dodge_cap[pclass] / (diminishing + dodge_cap[pclass] * m_diminishing_k[pclass]));
827
828 m_realDodge = m_realDodge < 0.0f ? 0.0f : m_realDodge;
829 float value = std::max(diminishing + nondiminishing, 0.0f);
830
831 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
832 {
833 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Dodge", 95.0f) : value;
834 }
835
837}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
void GetDodgeFromAgility(float &diminishing, float &nondiminishing)
Definition Player.cpp:5131

References CR_DEFENSE_SKILL, CR_DODGE, Unit::getClass(), GetDodgeFromAgility(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realDodge, MAX_CLASSES, PLAYER_DODGE_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_DODGE_PERCENT.

Referenced by AuraEffect::HandleAuraModDodgePercent(), UpdateDefenseBonusesMod(), UpdateRating(), and UpdateStats().

◆ UpdateDuelFlag()

void Player::UpdateDuelFlag ( time_t  currTime)
424{
425 if (duel && duel->State == DUEL_STATE_COUNTDOWN && duel->StartTime <= currTime)
426 {
427 sScriptMgr->OnPlayerDuelStart(this, duel->Opponent);
428
430 duel->Opponent->SetUInt32Value(PLAYER_DUEL_TEAM, 2);
431
433 duel->Opponent->duel->State = DUEL_STATE_IN_PROGRESS;
434 }
435}
@ DUEL_STATE_COUNTDOWN
Definition Player.h:367
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:368

References duel, DUEL_STATE_COUNTDOWN, DUEL_STATE_IN_PROGRESS, PLAYER_DUEL_TEAM, Unit::SetUInt32Value(), and sScriptMgr.

Referenced by Update().

◆ UpdateEnchantmentDurations()

void Player::UpdateEnchantmentDurations ( )
4741{
4742 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(); itr != m_enchantDuration.end(); ++itr)
4743 {
4744 itr->item->SetEnchantmentDuration(itr->slot, itr->leftduration, this);
4745 }
4746}

References m_enchantDuration.

Referenced by Spell::EffectSummonChangeItem().

◆ UpdateEnchantTime()

void Player::UpdateEnchantTime ( uint32  time)
4162{
4163 for (EnchantDurationList::iterator itr = m_enchantDuration.begin(), next; itr != m_enchantDuration.end(); itr = next)
4164 {
4165 ASSERT(itr->item);
4166 next = itr;
4167 if (!itr->item->GetEnchantmentId(itr->slot))
4168 {
4169 next = m_enchantDuration.erase(itr);
4170 }
4171 else if (itr->leftduration <= time)
4172 {
4173 ApplyEnchantment(itr->item, itr->slot, false, false);
4174 itr->item->ClearEnchantment(itr->slot);
4175 next = m_enchantDuration.erase(itr);
4176 }
4177 else if (itr->leftduration > time)
4178 {
4179 itr->leftduration -= time;
4180 ++next;
4181 }
4182 }
4183}

References ApplyEnchantment(), ASSERT, and m_enchantDuration.

Referenced by Update().

◆ UpdateEnergyRegen()

◆ UpdateEquipSpellsAtFormChange()

void Player::UpdateEquipSpellsAtFormChange ( )
1356{
1357 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
1358 {
1359 if (m_items[i] && !m_items[i]->IsBroken() &&
1361 {
1362 ApplyItemEquipSpell(m_items[i], false,
1363 true); // remove spells that not fit to form
1365 m_items[i], true,
1366 true); // add spells that fit form but not active
1367 }
1368 }
1369
1370 // item set bonuses not dependent from item broken state
1371 for (std::size_t setindex = 0; setindex < ItemSetEff.size(); ++setindex)
1372 {
1373 ItemSetEffect* eff = ItemSetEff[setindex];
1374 if (!eff)
1375 continue;
1376
1377 for (uint32 y = 0; y < MAX_ITEM_SET_SPELLS; ++y)
1378 {
1379 SpellInfo const* spellInfo = eff->spells[y];
1380 if (!spellInfo)
1381 continue;
1382
1383 ApplyEquipSpell(spellInfo, nullptr, false,
1384 true); // remove spells that not fit to form
1385 if (!sScriptMgr->OnPlayerCanApplyEquipSpellsItemSet(this, eff))
1386 break;
1387 ApplyEquipSpell(spellInfo, nullptr, true,
1388 true); // add spells that fit form but not active
1389 }
1390 }
1391}
#define MAX_ITEM_SET_SPELLS
Definition DBCStructure.h:1230
Definition Item.h:32
SpellInfo const * spells[8]
Definition Item.h:35

References ApplyEquipSpell(), ApplyItemEquipSpell(), Unit::CanUseAttackType(), GetAttackBySlot(), INVENTORY_SLOT_BAG_END, ItemSetEff, m_items, MAX_ITEM_SET_SPELLS, ItemSetEffect::spells, and sScriptMgr.

Referenced by InitDataForForm().

◆ UpdateExpertise()

void Player::UpdateExpertise ( WeaponAttackType  attType)
895{
896 if (attack == RANGED_ATTACK)
897 return;
898
899 float expertise = GetRatingBonusValue(CR_EXPERTISE);
900
901 Item* weapon = GetWeaponForAttack(attack, true);
902
904 for (AuraEffectList::const_iterator itr = expAuras.begin(); itr != expAuras.end(); ++itr)
905 {
906 // item neutral spell
907 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
908 expertise += (*itr)->GetAmount();
909 // item dependent spell
910 else if (weapon && weapon->IsFitToSpellRequirements((*itr)->GetSpellInfo()))
911 expertise += (*itr)->GetAmount();
912 }
913
914 if (expertise < 0)
915 expertise = 0;
916
917 switch (attack)
918 {
919 case BASE_ATTACK:
920 m_Expertise = expertise;
922 break;
923 case OFF_ATTACK:
924 m_OffhandExpertise = expertise;
926 break;
927 default:
928 break;
929 }
930}
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303
@ PLAYER_EXPERTISE
Definition UpdateFields.h:349
@ PLAYER_OFFHAND_EXPERTISE
Definition UpdateFields.h:350

References BASE_ATTACK, CR_EXPERTISE, Unit::GetAuraEffectsByType(), GetRatingBonusValue(), GetWeaponForAttack(), Item::IsFitToSpellRequirements(), m_Expertise, m_OffhandExpertise, OFF_ATTACK, PLAYER_EXPERTISE, PLAYER_OFFHAND_EXPERTISE, RANGED_ATTACK, Unit::SetUInt32Value(), and SPELL_AURA_MOD_EXPERTISE.

Referenced by DestroyItem(), EquipItem(), AuraEffect::HandleAuraModExpertise(), RemoveItem(), UpdateAllStats(), and UpdateRating().

◆ UpdateFallInformationIfNeed()

void Player::UpdateFallInformationIfNeed ( MovementInfo const &  minfo,
uint16  opcode 
)
2171{
2172 if (m_lastFallTime >= minfo.fallTime ||
2173 m_lastFallZ <= minfo.pos.GetPositionZ() || opcode == MSG_MOVE_FALL_LAND)
2174 SetFallInformation(minfo.fallTime, minfo.pos.GetPositionZ());
2175}
@ MSG_MOVE_FALL_LAND
Definition Opcodes.h:231

References MovementInfo::fallTime, Position::GetPositionZ(), m_lastFallTime, m_lastFallZ, MSG_MOVE_FALL_LAND, MovementInfo::pos, and SetFallInformation().

Referenced by WorldSession::ProcessMovementInfo().

◆ UpdateFFAPvPFlag()

void Player::UpdateFFAPvPFlag ( time_t  currTime)
392{
393 if (!IsFFAPvP() || sWorld->IsFFAPvPRealm() || !pvpInfo.FFAPvPEndTimer || currTime < pvpInfo.FFAPvPEndTimer + 30)
394 {
395 return;
396 }
397
398 pvpInfo.FFAPvPEndTimer = time_t(0);
400 {
402 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
403 }
404 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
405 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
406
407 // xinef: iterate attackers
408 AttackerSet toRemove;
409 AttackerSet const& attackers = getAttackers();
410 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end(); ++itr)
411 if (!(*itr)->IsValidAttackTarget(this))
412 toRemove.insert(*itr);
413
414 for (AttackerSet::const_iterator itr = toRemove.begin(); itr != toRemove.end(); ++itr)
415 (*itr)->AttackStop();
416
417 // xinef: remove our own victim
418 if (Unit* victim = GetVictim())
419 if (!IsValidAttackTarget(victim))
420 AttackStop();
421}
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:652
AttackerSet const & getAttackers() const
Definition Unit.h:883
time_t FFAPvPEndTimer
‍Time when player unflags himself for PvP (flag removed after 5 minutes)
Definition Player.h:361

References Unit::AttackStop(), PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by Update().

◆ UpdateFFAPvPState()

void Player::UpdateFFAPvPState ( bool  reset = true)
Todo:
: should we always synchronize UNIT_FIELD_BYTES_2, 1 of controller
1454{
1456 // and controlled? no, we shouldn't, those are checked for affecting player
1457 // by client
1458 if (!pvpInfo.IsInNoPvPArea && !IsGameMaster() &&
1459 (pvpInfo.IsInFFAPvPArea || sWorld->IsFFAPvPRealm()))
1460 {
1461 if (!IsFFAPvP())
1462 {
1463 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, true);
1465 for (ControlSet::iterator itr = m_Controlled.begin();
1466 itr != m_Controlled.end(); ++itr)
1467 (*itr)->SetByteValue(UNIT_FIELD_BYTES_2, 1,
1469 }
1470
1472 {
1473 pvpInfo.FFAPvPEndTimer = time_t(0);
1474 }
1475 }
1476 else if (IsFFAPvP())
1477 {
1478 if ((pvpInfo.IsInNoPvPArea || IsGameMaster()) || reset ||
1480 {
1481 pvpInfo.FFAPvPEndTimer = time_t(0);
1483 {
1485 sScriptMgr->OnPlayerFfaPvpStateUpdate(this, false);
1486 }
1487 for (ControlSet::iterator itr = m_Controlled.begin();
1488 itr != m_Controlled.end(); ++itr)
1489 (*itr)->RemoveByteFlag(UNIT_FIELD_BYTES_2, 1,
1491
1492 // xinef: iterate attackers
1493 AttackerSet toRemove;
1494 AttackerSet const& attackers = getAttackers();
1495 for (AttackerSet::const_iterator itr = attackers.begin();
1496 itr != attackers.end(); ++itr)
1497 if (!(*itr)->IsValidAttackTarget(this))
1498 toRemove.insert(*itr);
1499
1500 for (AttackerSet::const_iterator itr = toRemove.begin();
1501 itr != toRemove.end(); ++itr)
1502 (*itr)->AttackStop();
1503
1504 // xinef: remove our own victim
1505 if (Unit* victim = GetVictim())
1506 if (!IsValidAttackTarget(victim))
1507 AttackStop();
1508 }
1509 else
1510 {
1511 // Not in FFA PvP Area
1512 // Not FFA PvP realm
1513 // Not FFA PvP timer already set
1514 // Being recently in PvP combat
1515 if (!pvpInfo.IsInFFAPvPArea && !sWorld->IsFFAPvPRealm() &&
1517 {
1519 GameTime::GetGameTime().count() +
1520 sWorld->getIntConfig(CONFIG_FFA_PVP_TIMER);
1521 }
1522 }
1523 }
1524}
@ CONFIG_FFA_PVP_TIMER
Definition WorldConfig.h:373
time_t EndTimer
‍Marks if player is in an FFAPvP area (such as Gurubashi Arena)
Definition Player.h:360

References Unit::AttackStop(), CONFIG_FFA_PVP_TIMER, PvPInfo::EndTimer, PvPInfo::FFAPvPEndTimer, Unit::getAttackers(), GameTime::GetGameTime(), Unit::GetVictim(), Object::HasByteFlag(), IsFFAPvP(), IsGameMaster(), PvPInfo::IsInFFAPvPArea, PvPInfo::IsInNoPvPArea, Unit::IsValidAttackTarget(), Unit::m_Controlled, pvpInfo, Object::RemoveByteFlag(), Object::SetByteFlag(), sScriptMgr, sWorld, UNIT_BYTE2_FLAG_FFA_PVP, and UNIT_FIELD_BYTES_2.

Referenced by UpdateArea(), and UpdatePvPState().

◆ UpdateFishingSkill()

bool Player::UpdateFishingSkill ( )
887{
888 LOG_DEBUG("entities.player.skills", "UpdateFishingSkill");
889
891
892 if (SkillValue >= GetMaxSkillValue(SKILL_FISHING))
893 {
894 return false;
895 }
896
897 /* Whenever the player clicks on the fishing gameobject the
898 * core will decide based on a probability if the skill raises or not.
899 */
900 return UpdateSkillPro(
902 static_cast<int32>(getProbabilityOfLevelUp(SkillValue)) * 10,
903 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING));
904}
float getProbabilityOfLevelUp(uint32 SkillValue)
Definition PlayerUpdates.cpp:865
@ CONFIG_SKILL_GAIN_GATHERING
Definition WorldConfig.h:225
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5486

References CONFIG_SKILL_GAIN_GATHERING, GetMaxSkillValue(), getProbabilityOfLevelUp(), GetPureSkillValue(), LOG_DEBUG, SKILL_FISHING, sWorld, and UpdateSkillPro().

Referenced by GameObject::Use().

◆ UpdateForQuestWorldObjects()

void Player::UpdateForQuestWorldObjects ( )

This code doesn't look right, but it was logically converted to condition system to do the exact same thing it did before. It definitely needs to be overlooked for intended functionality.

1778{
1779 if (GetObjectVisibilityContainer().GetVisibleWorldObjectsMap()->empty())
1780 return;
1781
1782 UpdateData udata;
1783 DoForAllVisibleWorldObjects([this, &udata](WorldObject* worldObject)
1784 {
1785 if (worldObject->IsGameObject())
1786 {
1787 if (GameObject* obj = worldObject->ToGameObject())
1788 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1789 }
1790 else if (worldObject->IsCreature())
1791 {
1792 Creature* obj = worldObject->ToCreature();
1793 if (!obj)
1794 return;
1795
1796 // check if this unit requires quest specific flags
1797 if (obj->HasNpcFlag(UNIT_NPC_FLAG_SPELLCLICK))
1798 {
1799 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(obj->GetEntry());
1800 for (SpellClickInfoContainer::const_iterator _itr = clickPair.first; _itr != clickPair.second; ++_itr)
1801 {
1804 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(obj->GetEntry(), _itr->second.spellId);
1805 bool buildUpdateBlock = false;
1806 for (ConditionList::const_iterator jtr = conds.begin(); jtr != conds.end() && !buildUpdateBlock; ++jtr)
1807 if ((*jtr)->ConditionType == CONDITION_QUESTREWARDED || (*jtr)->ConditionType == CONDITION_QUESTTAKEN)
1808 buildUpdateBlock = true;
1809
1810 if (buildUpdateBlock)
1811 {
1812 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1813 break;
1814 }
1815 }
1816 }
1817 else if (obj->HasNpcFlag(UNIT_NPC_FLAG_VENDOR_MASK | UNIT_NPC_FLAG_TRAINER))
1818 obj->BuildValuesUpdateBlockForPlayer(&udata, this);
1819 }
1820 });
1821
1822 if (!udata.HasData())
1823 return;
1824
1825 WorldPacket packet;
1826 udata.BuildPacket(packet);
1827 SendDirectMessage(&packet);
1828}
@ UNIT_NPC_FLAG_VENDOR_MASK
Definition UnitDefines.h:347
Definition UpdateData.h:52
bool HasData() const
Definition UpdateData.h:60
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

References WorldObject::DoForAllVisibleWorldObjects(), WorldObject::GetObjectVisibilityContainer(), Object::IsCreature(), Object::IsGameObject(), UNIT_NPC_FLAG_TRAINER, and UNIT_NPC_FLAG_VENDOR_MASK.

Referenced by Group::AddMember(), Group::Disband(), EquipItem(), ItemAddedQuestCheck(), ItemRemovedQuestCheck(), Group::RemoveMember(), and SendQuestUpdate().

◆ UpdateGatherSkill()

bool Player::UpdateGatherSkill ( uint32  SkillId,
uint32  SkillValue,
uint32  RedLevel,
uint32  Multiplicator = 1 
)
764{
765 LOG_DEBUG("entities.player.skills",
766 "UpdateGatherSkill(SkillId {} SkillLevel {} RedLevel {})",
767 SkillId, SkillValue, RedLevel);
768
769 uint32 gathering_skill_gain =
770 sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
771 sScriptMgr->OnPlayerUpdateGatheringSkill(this, SkillId, SkillValue, RedLevel + 100, RedLevel + 50, RedLevel + 25, gathering_skill_gain);
772
773 // For skinning and Mining chance decrease with level. 1-74 - no decrease,
774 // 75-149 - 2 times, 225-299 - 8 times
775 switch (SkillId)
776 {
777 case SKILL_HERBALISM:
781 return UpdateSkillPro(SkillId,
782 SkillGainChance(SkillValue, RedLevel + 100,
783 RedLevel + 50, RedLevel + 25) *
784 Multiplicator,
785 gathering_skill_gain);
786 case SKILL_SKINNING:
787 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
788 return UpdateSkillPro(SkillId,
789 SkillGainChance(SkillValue, RedLevel + 100,
790 RedLevel + 50,
791 RedLevel + 25) *
792 Multiplicator,
793 gathering_skill_gain);
794 else
795 return UpdateSkillPro(
796 SkillId,
797 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
798 RedLevel + 25) *
799 Multiplicator) >>
800 (SkillValue /
802 gathering_skill_gain);
803 case SKILL_MINING:
804 if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
805 return UpdateSkillPro(SkillId,
806 SkillGainChance(SkillValue, RedLevel + 100,
807 RedLevel + 50,
808 RedLevel + 25) *
809 Multiplicator,
810 gathering_skill_gain);
811 else
812 return UpdateSkillPro(
813 SkillId,
814 (SkillGainChance(SkillValue, RedLevel + 100, RedLevel + 50,
815 RedLevel + 25) *
816 Multiplicator) >>
817 (SkillValue /
819 gathering_skill_gain);
820 }
821 return false;
822}
@ SKILL_INSCRIPTION
Definition SharedDefines.h:3252
@ SKILL_MINING
Definition SharedDefines.h:3169
@ SKILL_SKINNING
Definition SharedDefines.h:3211
@ SKILL_JEWELCRAFTING
Definition SharedDefines.h:3235
@ SKILL_HERBALISM
Definition SharedDefines.h:3165
@ CONFIG_SKILL_CHANCE_SKINNING_STEPS
Definition WorldConfig.h:222
@ CONFIG_SKILL_CHANCE_MINING_STEPS
Definition WorldConfig.h:221

References CONFIG_SKILL_CHANCE_MINING_STEPS, CONFIG_SKILL_CHANCE_SKINNING_STEPS, CONFIG_SKILL_GAIN_GATHERING, LOG_DEBUG, SKILL_HERBALISM, SKILL_INSCRIPTION, SKILL_JEWELCRAFTING, SKILL_LOCKPICKING, SKILL_MINING, SKILL_SKINNING, SkillGainChance(), sScriptMgr, sWorld, and UpdateSkillPro().

Referenced by Spell::EffectMilling(), Spell::EffectOpenLock(), Spell::EffectProspecting(), Spell::EffectSkinning(), and GetExplicitDiscoverySpell().

◆ UpdateHomebindTime()

void Player::UpdateHomebindTime ( uint32  time)
1394{
1395 // GMs never get homebind timer online
1397 {
1398 if (m_HomebindTimer) // instance valid, but timer not reset
1399 {
1400 // hide reminder
1401 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1402 data << uint32(0);
1403 data << uint32(0);
1404 SendDirectMessage(&data);
1405 }
1406 // instance is valid, reset homebind timer
1407 m_HomebindTimer = 0;
1408 }
1409 else if (m_HomebindTimer > 0)
1410 {
1411 if (time >= m_HomebindTimer)
1412 {
1413 // teleport to nearest graveyard
1415 }
1416 else
1417 m_HomebindTimer -= time;
1418 }
1419 else
1420 {
1421 // instance is invalid, start homebind timer
1422 m_HomebindTimer = 60000;
1423 // send message to player
1424 WorldPacket data(SMSG_RAID_GROUP_ONLY, 4 + 4);
1425 data << uint32(m_HomebindTimer);
1426 data << uint32(1);
1427 SendDirectMessage(&data);
1428 LOG_DEBUG(
1429 "maps",
1430 "PLAYER: Player '{}' ({}) will be teleported to homebind in 60 "
1431 "seconds",
1432 GetName(), GetGUID().ToString());
1433 }
1434}
@ SMSG_RAID_GROUP_ONLY
Definition Opcodes.h:676

References Object::GetGUID(), WorldObject::GetName(), IsGameMaster(), LOG_DEBUG, m_HomebindTimer, m_InstanceValid, RepopAtGraveyard(), SendDirectMessage(), SMSG_RAID_GROUP_ONLY, and Position::ToString().

Referenced by Update().

◆ UpdateHonorFields()

void Player::UpdateHonorFields ( )

called when rewarding honor and at each save

1183{
1185 time_t now = time_t(GameTime::GetGameTime().count());
1186 time_t today = time_t(GameTime::GetGameTime().count() / DAY) * DAY;
1187
1188 if (m_lastHonorUpdateTime < today)
1189 {
1190 time_t yesterday = today - DAY;
1191
1193
1194 // update yesterday's contribution
1195 if (m_lastHonorUpdateTime >= yesterday)
1196 {
1199
1200 // this is the first update today, reset today's contribution
1203 }
1204 else
1205 {
1206 // no honor/kills yesterday or today, reset
1209 }
1210 }
1211
1213}
uint16 PAIR32_LOPART(uint32 x)
Definition ObjectDefines.h:98

References DAY, GameTime::GetGameTime(), Object::GetUInt32Value(), m_lastHonorUpdateTime, MAKE_PAIR32(), PAIR32_LOPART(), PLAYER_FIELD_KILLS, PLAYER_FIELD_TODAY_CONTRIBUTION, PLAYER_FIELD_YESTERDAY_CONTRIBUTION, and Unit::SetUInt32Value().

Referenced by honor_commandscript::HandleHonorUpdateCommand(), LoadFromDB(), RewardHonor(), and SaveToDB().

◆ UpdateInvisibilityDrunkDetect()

void Player::UpdateInvisibilityDrunkDetect ( )
1011{
1012 // select drunk percent or total SPELL_AURA_MOD_FAKE_INEBRIATE amount, whichever is higher for visibility updates
1013 uint8 drunkValue = GetDrunkValue();
1014 int32 fakeDrunkValue = GetFakeDrunkValue();
1015 int32 maxDrunkValue = std::max<int32>(drunkValue, fakeDrunkValue);
1016
1017 if (maxDrunkValue != 0)
1018 {
1021 }
1022 else
1024
1026}
@ INVISIBILITY_DRUNK
Definition SharedDefines.h:1272
void AddFlag(FLAG_TYPE flag)
Definition Object.h:391
void DelFlag(FLAG_TYPE flag)
Definition Object.h:392
int32 GetFakeDrunkValue() const
Definition Player.h:2172
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPES > m_invisibilityDetect
Definition Object.h:611

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::AddFlag(), FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::DelFlag(), GetDrunkValue(), GetFakeDrunkValue(), INVISIBILITY_DRUNK, WorldObject::m_invisibilityDetect, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by AuraEffect::HandleAuraModFakeInebriation(), and SetDrunkValue().

◆ UpdateItemDuration()

void Player::UpdateItemDuration ( uint32  time,
bool  realtimeonly = false 
)
4145{
4146 if (m_itemDuration.empty())
4147 return;
4148
4149 LOG_DEBUG("entities.player.items", "Player::UpdateItemDuration({}, {})", time, realtimeonly);
4150
4151 for (ItemDurationList::const_iterator itr = m_itemDuration.begin(); itr != m_itemDuration.end();)
4152 {
4153 Item* item = *itr;
4154 ++itr; // current element can be erased in UpdateDuration
4155
4156 if (!realtimeonly || item->GetTemplate()->HasFlagCu(ITEM_FLAGS_CU_DURATION_REAL_TIME))
4157 item->UpdateDuration(this, time);
4158 }
4159}
@ ITEM_FLAGS_CU_DURATION_REAL_TIME
Definition ItemTemplate.h:219
void UpdateDuration(Player *owner, uint32 diff)
Definition Item.cpp:318
bool HasFlagCu(ItemFlagsCustom flag) const
Definition ItemTemplate.h:827

References Item::GetTemplate(), ItemTemplate::HasFlagCu(), ITEM_FLAGS_CU_DURATION_REAL_TIME, LOG_DEBUG, m_itemDuration, and Item::UpdateDuration().

Referenced by LoadFromDB(), and Update().

◆ UpdateItemObtainSpells()

void Player::UpdateItemObtainSpells ( Item item,
uint8  bag,
uint8  slot 
)
7054{
7055 if (IsBankPos(bag, slot))
7056 ApplyItemObtainSpells(item, false);
7057 else if (bag == INVENTORY_SLOT_BAG_0 || (bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END))
7058 ApplyItemObtainSpells(item, true);
7059}

References ApplyItemObtainSpells(), INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_BAG_END, INVENTORY_SLOT_BAG_START, and IsBankPos().

Referenced by _StoreItem().

◆ UpdateLFGChannel()

void Player::UpdateLFGChannel ( )
465{
466 if (!sWorld->getBoolConfig(CONFIG_RESTRICTED_LFG_CHANNEL))
467 return;
468
470 if (!cMgr)
471 return;
472
473 ChatChannelsEntry const* cce = sChatChannelsStore.LookupEntry(26); /*LookingForGroup*/
475 if (!cLFG)
476 return;
477
478 Channel* cUsed = nullptr;
479 for (Channel* channel : m_channels)
480 if (channel && channel->GetChannelId() == cce->ChannelID)
481 {
482 cUsed = cLFG;
483 break;
484 }
485
486 if (IsUsingLfg())
487 {
488 if (cUsed == cLFG)
489 return;
490
491 cLFG->JoinChannel(this, "");
492 }
493 else
494 {
495 if (cLFG != cUsed)
496 return;
497
498 cLFG->LeaveChannel(this, true);
499 }
500}
DBCStorage< ChatChannelsEntry > sChatChannelsStore(ChatChannelsEntryfmt)
@ CONFIG_RESTRICTED_LFG_CHANNEL
Definition WorldConfig.h:57
Definition ChannelMgr.h:29
static ChannelMgr * forTeam(TeamId teamId)
Definition ChannelMgr.cpp:33
Channel * GetJoinChannel(std::string const &name, uint32 channel_id)
Definition ChannelMgr.cpp:121
void JoinChannel(Player *player, std::string const &pass)
Definition Channel.cpp:157
bool IsUsingLfg()
Definition Player.cpp:13115
LocaleConstant GetSessionDbcLocale() const
Definition WorldSession.h:559
Definition DBCStructure.h:643
uint32 ChannelID
Definition DBCStructure.h:644
char const * pattern[16]
Definition DBCStructure.h:646

References ChatChannelsEntry::ChannelID, CONFIG_RESTRICTED_LFG_CHANNEL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsUsingLfg(), Channel::JoinChannel(), Channel::LeaveChannel(), m_channels, m_session, ChatChannelsEntry::pattern, sChatChannelsStore, and sWorld.

Referenced by WorldSession::HandleLfgJoinOpcode(), and WorldSession::HandleLfgLeaveOpcode().

◆ UpdateLocalChannels()

void Player::UpdateLocalChannels ( uint32  newZone)
503{
504 // pussywizard: mutex needed (tc changed opcode to THREAD UNSAFE)
505 static std::mutex channelsLock;
506 std::lock_guard<std::mutex> guard(channelsLock);
507
508 if (GetSession()->PlayerLoading() && !IsBeingTeleportedFar())
509 return; // The client handles it automatically after loading, but not
510 // after teleporting
511
512 AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(newZone);
513 if (!current_zone)
514 return;
515
517 if (!cMgr)
518 return;
519
520 std::string current_zone_name =
521 current_zone->area_name[GetSession()->GetSessionDbcLocale()];
522
523 for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
524 {
525 if (ChatChannelsEntry const* channel =
526 sChatChannelsStore.LookupEntry(i))
527 {
528 Channel* usedChannel = nullptr;
529
530 for (Channel* channel : m_channels)
531 {
532 if (channel && channel->GetChannelId() == i)
533 {
534 usedChannel = channel;
535 break;
536 }
537 }
538
539 Channel* removeChannel = nullptr;
540 Channel* joinChannel = nullptr;
541 bool sendRemove = true;
542
543 if (CanJoinConstantChannelInZone(channel, current_zone))
544 {
545 if (!(channel->flags & CHANNEL_DBC_FLAG_GLOBAL))
546 {
547 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY &&
548 usedChannel)
549 continue; // Already on the channel, as city channel
550 // names are not changing
551
552 char new_channel_name_buf[100];
553 std::string currentNameExt;
554
555 if (channel->flags & CHANNEL_DBC_FLAG_CITY_ONLY)
556 currentNameExt = sObjectMgr->GetAcoreStringForDBCLocale(LANG_CHANNEL_CITY);
557 else
558 currentNameExt = current_zone_name;
559
560 snprintf(new_channel_name_buf, 100,
561 channel->pattern[m_session->GetSessionDbcLocale()],
562 currentNameExt.c_str());
563
564 joinChannel = cMgr->GetJoinChannel(new_channel_name_buf,
565 channel->ChannelID);
566 if (usedChannel)
567 {
568 if (joinChannel != usedChannel)
569 {
570 removeChannel = usedChannel;
571 sendRemove = false; // Do not send leave channel, it
572 // already replaced at client
573 }
574 else
575 joinChannel = nullptr;
576 }
577 }
578 else
579 joinChannel = cMgr->GetJoinChannel(
580 channel->pattern[m_session->GetSessionDbcLocale()],
581 channel->ChannelID);
582 }
583 else
584 removeChannel = usedChannel;
585
586 if (joinChannel)
587 joinChannel->JoinChannel(
588 this, ""); // Changed Channel: ... or Joined Channel: ...
589
590 if (removeChannel)
591 {
592 removeChannel->LeaveChannel(this,
593 sendRemove); // Leave old channel
594 std::string name =
595 removeChannel
596 ->GetName(); // Store name, (*i)erase in LeftChannel
597 LeftChannel(removeChannel); // Remove from player's channel list
598 }
599 }
600 }
601}
@ CHANNEL_DBC_FLAG_GLOBAL
Definition Channel.h:95
@ LANG_CHANNEL_CITY
Definition Language.h:764
std::string const & GetName() const
Definition Channel.h:179
void LeftChannel(Channel *c)
Definition Player.cpp:5016
bool CanJoinConstantChannelInZone(ChatChannelsEntry const *channel, AreaTableEntry const *zone)
Definition Player.cpp:4993
char const * area_name[16]
Definition DBCStructure.h:527

References AreaTableEntry::area_name, CanJoinConstantChannelInZone(), CHANNEL_DBC_FLAG_CITY_ONLY, CHANNEL_DBC_FLAG_GLOBAL, ChannelMgr::forTeam(), ChannelMgr::GetJoinChannel(), Channel::GetName(), GetSession(), WorldSession::GetSessionDbcLocale(), GetTeamId(), IsBeingTeleportedFar(), Channel::JoinChannel(), LANG_CHANNEL_CITY, Channel::LeaveChannel(), LeftChannel(), m_channels, m_session, sAreaTableStore, sChatChannelsStore, and sObjectMgr.

Referenced by UpdateZone().

◆ UpdateLootAchievements()

void Player::UpdateLootAchievements ( LootItem item,
Loot loot 
)

◆ UpdateManaRegen()

void Player::UpdateManaRegen ( )
944{
946 {
949 return;
950 }
951
952 float Intellect = GetStat(STAT_INTELLECT);
953 // Mana regen from spirit and intellect
954 float power_regen = std::sqrt(Intellect) * OCTRegenMPPerSpirit();
955 // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen
957
958 // Mana regen from SPELL_AURA_MOD_POWER_REGEN aura
960
961 // Get bonus from SPELL_AURA_MOD_MANA_REGEN_FROM_STAT aura
963 for (AuraEffectList::const_iterator i = regenAura.begin(); i != regenAura.end(); ++i)
964 {
965 power_regen_mp5 += GetStat(Stats((*i)->GetMiscValue())) * (*i)->GetAmount() / 500.0f;
966 }
967
968 // Set regen rate in cast state apply only on spirit based regen
970 if (modManaRegenInterrupt > 100)
971 modManaRegenInterrupt = 100;
972 SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + AsUnderlyingType(POWER_MANA), power_regen_mp5 + CalculatePct(power_regen, modManaRegenInterrupt));
973
975}
@ SPELL_AURA_MOD_MANA_REGEN_INTERRUPT
Definition SpellAuraDefines.h:197
@ SPELL_AURA_MOD_MANA_REGEN_FROM_STAT
Definition SpellAuraDefines.h:282
float OCTRegenMPPerSpirit()
Definition Player.cpp:5259

References AsUnderlyingType(), CalculatePct(), Unit::GetAuraEffectsByType(), Unit::GetStat(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierByMiscValue(), Unit::GetTotalAuraMultiplierByMiscValue(), Unit::HasAuraTypeWithMiscvalue(), m_baseManaRegen, OCTRegenMPPerSpirit(), POWER_MANA, Object::SetStatFloatValue(), SPELL_AURA_MOD_MANA_REGEN_FROM_STAT, SPELL_AURA_MOD_MANA_REGEN_INTERRUPT, SPELL_AURA_MOD_POWER_REGEN, SPELL_AURA_MOD_POWER_REGEN_PERCENT, SPELL_AURA_PREVENT_REGENERATE_POWER, STAT_INTELLECT, UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, and UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER.

Referenced by ApplyManaRegenBonus(), AuraEffect::HandleModManaRegen(), AuraEffect::HandleModPowerRegen(), UpdateAllStats(), and UpdateStats().

◆ UpdateMaxHealth()

void Player::UpdateMaxHealth ( )
overridevirtual

Implements Unit.

314{
315 UnitMods unitMod = UNIT_MOD_HEALTH;
316
317 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreateHealth();
318 value *= GetModifierValue(unitMod, BASE_PCT);
320 value *= GetModifierValue(unitMod, TOTAL_PCT);
321
322 sScriptMgr->OnPlayerAfterUpdateMaxHealth(this, value);
323 SetMaxHealth((uint32)value);
324}
float GetHealthBonusFromStamina()
Definition StatSystem.cpp:293

References BASE_PCT, BASE_VALUE, Unit::GetCreateHealth(), GetHealthBonusFromStamina(), Unit::GetModifierValue(), Unit::SetMaxHealth(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_HEALTH.

Referenced by UpdateAllStats(), and UpdateStats().

◆ UpdateMaxPower()

void Player::UpdateMaxPower ( Powers  power)
overridevirtual

Implements Unit.

327{
328 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_POWER_START) + power);
329
330 float bonusPower = (power == POWER_MANA && GetCreatePowers(power) > 0) ? GetManaBonusFromIntellect() : 0;
331
332 float value = GetModifierValue(unitMod, BASE_VALUE) + GetCreatePowers(power);
333 value *= GetModifierValue(unitMod, BASE_PCT);
334 value += GetModifierValue(unitMod, TOTAL_VALUE) + bonusPower;
335 value *= GetModifierValue(unitMod, TOTAL_PCT);
336
337 sScriptMgr->OnPlayerAfterUpdateMaxPower(this, power, value);
338 SetMaxPower(power, uint32(value));
339}
@ UNIT_MOD_POWER_START
Definition Unit.h:176
float GetManaBonusFromIntellect()
Definition StatSystem.cpp:303

References BASE_PCT, BASE_VALUE, Unit::GetCreatePowers(), GetManaBonusFromIntellect(), Unit::GetModifierValue(), POWER_MANA, Unit::SetMaxPower(), sScriptMgr, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_POWER_START.

Referenced by Create(), UpdateAllStats(), and UpdateStats().

◆ UpdateMeleeHitChances()

void Player::UpdateMeleeHitChances ( )

◆ UpdateMirrorTimers()

void Player::UpdateMirrorTimers ( )
430{
431 // Desync flags for update on next HandleDrowning
433 m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
434}

References m_MirrorTimerFlags, and m_MirrorTimerFlagsLast.

Referenced by AuraEffect::HandleWaterBreathing().

◆ UpdateNextMailTimeAndUnreads()

void Player::UpdateNextMailTimeAndUnreads ( )
437{
438 // Update the next delivery time and unread mails
439 time_t cTime = GameTime::GetGameTime().count();
440
442 unReadMails = 0;
443
444 for (Mail const* mail : GetMails())
445 {
446 if (mail->deliver_time > cTime)
447 {
448 if (!m_nextMailDelivereTime || m_nextMailDelivereTime > mail->deliver_time)
449 m_nextMailDelivereTime = mail->deliver_time;
450 }
451
452 // must be not checked yet
453 if (mail->checked & MAIL_CHECK_MASK_READ)
454 continue;
455
456 // and already delivered or expired
457 if (cTime < mail->deliver_time || cTime > mail->expire_time)
458 continue;
459
460 unReadMails++;
461 }
462}
@ MAIL_CHECK_MASK_READ
Definition Mail.h:47
PlayerMails const & GetMails() const
Definition Player.h:1647

References GameTime::GetGameTime(), GetMails(), m_nextMailDelivereTime, MAIL_CHECK_MASK_READ, and unReadMails.

Referenced by _LoadMail(), and WorldSession::HandleGetMailList().

◆ UpdateObjectVisibility()

void Player::UpdateObjectVisibility ( bool  forced = true,
bool  fromUpdate = false 
)
overridevirtual

Reimplemented from WorldObject.

1605{
1606 // Prevent updating visibility if player is not in world (example: LoadFromDB sets drunkstate which updates invisibility while player is not in map)
1607 if (!IsInWorld())
1608 return;
1609
1610 if (!forced)
1612 else if (!isBeingLoaded())
1613 {
1614 if (!fromUpdate) // pussywizard:
1615 {
1617 return;
1618 }
1621 }
1622}
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19161
void AddToNotify(uint16 f)
Definition Object.cpp:2971

References WorldObject::AddToNotify(), Unit::bRequestForcedVisibilityUpdate, isBeingLoaded(), Object::IsInWorld(), NOTIFY_VISIBILITY_CHANGED, Unit::UpdateObjectVisibility(), and UpdateVisibilityForPlayer().

Referenced by Map::AddPlayerToMap(), gm_commandscript::HandleGMVisibleCommand(), WorldSession::HandlePlayerLoginToCharInWorld(), Map::PlayerRelocation(), ResurrectPlayer(), SetGameMaster(), SetGroup(), Update(), and UpdateInvisibilityDrunkDetect().

◆ UpdateParryPercentage()

void Player::UpdateParryPercentage ( )
753{
754 const float parry_cap[MAX_CLASSES] =
755 {
756 47.003525f, // Warrior
757 47.003525f, // Paladin
758 145.560408f, // Hunter
759 145.560408f, // Rogue
760 0.0f, // Priest
761 47.003525f, // DK
762 145.560408f, // Shaman
763 0.0f, // Mage
764 0.0f, // Warlock
765 0.0f, // ??
766 0.0f // Druid
767 };
768
769 // No parry
770 float value = 0.0f;
771 m_realParry = 0.0f;
772 uint32 pclass = getClass() - 1;
773 if (CanParry() && parry_cap[pclass] > 0.0f)
774 {
775 float nondiminishing = 5.0f;
776 // Parry from rating
777 float diminishing = GetRatingBonusValue(CR_PARRY);
778 // Modify value from defense skill (only bonus from defense rating diminishes)
779 nondiminishing += (GetSkillValue(SKILL_DEFENSE) - GetMaxSkillValueForLevel()) * 0.04f;
780 diminishing += (int32(GetRatingBonusValue(CR_DEFENSE_SKILL))) * 0.04f;
781 // Parry from SPELL_AURA_MOD_PARRY_PERCENT aura
783 // apply diminishing formula to diminishing parry chance
784 m_realParry = nondiminishing + diminishing * parry_cap[pclass] / (diminishing + parry_cap[pclass] * m_diminishing_k[pclass]);
785 m_realParry = m_realParry < 0.0f ? 0.0f : m_realParry;
786
787 value = std::max(diminishing + nondiminishing, 0.0f);
788
789 if (sConfigMgr->GetOption<bool>("Stats.Limits.Enable", false))
790 {
791 value = value > sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) ? sConfigMgr->GetOption<float>("Stats.Limits.Parry", 95.0f) : value;
792 }
793 }
794
796}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110
bool CanParry() const
Definition Player.h:2183

References CanParry(), CR_DEFENSE_SKILL, CR_PARRY, Unit::getClass(), GetMaxSkillValueForLevel(), GetRatingBonusValue(), GetSkillValue(), Unit::GetTotalAuraModifier(), m_diminishing_k, m_realParry, MAX_CLASSES, PLAYER_PARRY_PERCENTAGE, sConfigMgr, Object::SetStatFloatValue(), SKILL_DEFENSE, and SPELL_AURA_MOD_PARRY_PERCENT.

Referenced by AuraEffect::HandleAuraModParryPercent(), SetCanParry(), UpdateDefenseBonusesMod(), and UpdateRating().

◆ UpdatePlayerSetting()

void Player::UpdatePlayerSetting ( std::string const &  source,
uint32  index,
uint32  value 
)
160{
161 auto it = m_charSettingsMap.find(source);
162 size_t const requiredSize = static_cast<size_t>(index) + 1;
163
164 if (it == m_charSettingsMap.end())
165 {
166 // Settings not found, create new vector of appropriate size
167 PlayerSettingVector settings(requiredSize); // default-initialized PlayerSetting
168 settings[index].value = value;
169
170 m_charSettingsMap.emplace(source, std::move(settings));
171 }
172 else
173 {
174 PlayerSettingVector& settings = it->second;
175 if (settings.size() < requiredSize)
176 settings.resize(requiredSize); // new elements default to zero
177
178 settings[index].value = value;
179 }
180}

References m_charSettingsMap.

Referenced by GetPlayerSetting(), and player_settings_commandscript::HandleSettingsAnnouncerFlags().

◆ UpdatePosition() [1/2]

bool Player::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline
2022{ return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
bool UpdatePosition(float x, float y, float z, float orientation, bool teleport=false) override
Definition PlayerUpdates.cpp:1156

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and UpdatePosition().

Referenced by UpdatePosition().

◆ UpdatePosition() [2/2]

bool Player::UpdatePosition ( float  x,
float  y,
float  z,
float  orientation,
bool  teleport = false 
)
overridevirtual

Reimplemented from Unit.

1158{
1159 if (!Unit::UpdatePosition(x, y, z, orientation, teleport))
1160 return false;
1161
1162 // Update player zone if needed
1163 if (m_needZoneUpdate)
1164 {
1165 uint32 newZone, newArea;
1166 GetZoneAndAreaId(newZone, newArea);
1167 UpdateZone(newZone, newArea);
1168 m_needZoneUpdate = false;
1169 }
1170
1171 if (GetGroup())
1173
1176
1178
1179 return true;
1180}
@ GROUP_UPDATE_FLAG_POSITION
Definition Group.h:108
@ TRADE_STATUS_TRADE_CANCELED
Definition SharedDefines.h:3819
void CheckAreaExploreAndOutdoor()
Definition Player.cpp:5734
Player * GetTrader() const
Definition Player.h:1374
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:19784

References CheckAreaExploreAndOutdoor(), GetGroup(), GetSession(), GetTrader(), WorldObject::GetZoneAndAreaId(), GROUP_UPDATE_FLAG_POSITION, INTERACTION_DISTANCE, WorldObject::IsWithinDistInMap(), m_needZoneUpdate, WorldSession::SendCancelTrade(), SetGroupUpdateFlag(), TRADE_STATUS_TRADE_CANCELED, Unit::UpdatePosition(), and UpdateZone().

Referenced by spell_rog_killing_spree_aura::HandleEffectPeriodic(), and WorldSession::HandleMoveTeleportAck().

◆ UpdatePotionCooldown()

void Player::UpdatePotionCooldown ( Spell spell = nullptr)
1544{
1545 // no potion used i combat or still in combat
1546 if (!GetLastPotionId() || IsInCombat())
1547 return;
1548
1549 // Call not from spell cast, send cooldown event for item spells if no in
1550 // combat
1551 if (!spell)
1552 {
1553 // spell/item pair let set proper cooldown (except not existed charged
1554 // spell cooldown spellmods for potions)
1555 if (ItemTemplate const* proto =
1556 sObjectMgr->GetItemTemplate(GetLastPotionId()))
1557 for (uint8 idx = 0; idx < MAX_ITEM_SPELLS; ++idx)
1558 if (proto->Spells[idx].SpellId &&
1559 proto->Spells[idx].SpellTrigger == ITEM_SPELLTRIGGER_ON_USE)
1560 if (SpellInfo const* spellInfo =
1561 sSpellMgr->GetSpellInfo(proto->Spells[idx].SpellId))
1562 SendCooldownEvent(spellInfo, GetLastPotionId());
1563 }
1564 // from spell cases (m_lastPotionId set in Spell::SendSpellCooldown)
1565 else
1566 {
1567 if (spell->IsIgnoringCooldowns())
1568 return;
1569
1571 }
1572
1573 SetLastPotionId(0);
1574}
void SetLastPotionId(uint32 item_id)
Definition Player.h:1808
uint32 GetLastPotionId()
Definition Player.h:1807
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11127
bool IsIgnoringCooldowns() const
Definition Spell.cpp:8024

References GetLastPotionId(), Spell::IsIgnoringCooldowns(), Unit::IsInCombat(), ITEM_SPELLTRIGGER_ON_USE, m_lastPotionId, Spell::m_spellInfo, MAX_ITEM_SPELLS, SendCooldownEvent(), SetLastPotionId(), sObjectMgr, and sSpellMgr.

Referenced by Spell::finish().

◆ UpdatePvP()

void Player::UpdatePvP ( bool  state,
bool  _override = false 
)

◆ UpdatePvPFlag()

void Player::UpdatePvPFlag ( time_t  currTime)
373{
374 if (!IsPvP())
375 return;
376
377 if (pvpInfo.EndTimer == 0 || pvpInfo.IsHostile)
378 return;
379
380 if (currTime < (pvpInfo.EndTimer + 300 + 5))
381 {
382 if (currTime > (pvpInfo.EndTimer + 4) && !HasPlayerFlag(PLAYER_FLAGS_PVP_TIMER))
384
385 return;
386 }
387
388 UpdatePvP(false);
389}
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1526

References PvPInfo::EndTimer, HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_PVP_TIMER, pvpInfo, SetPlayerFlag(), and UpdatePvP().

Referenced by Update().

◆ UpdatePvPState()

void Player::UpdatePvPState ( )
1437{
1439
1440 if (pvpInfo.IsHostile) // in hostile area
1441 {
1442 if (!IsPvP() || pvpInfo.EndTimer != 0)
1443 UpdatePvP(true, true);
1444 }
1445 else // in friendly area
1446 {
1448 pvpInfo.EndTimer == 0)
1449 pvpInfo.EndTimer = GameTime::GetGameTime().count(); // start toggle-off
1450 }
1451}
@ PLAYER_FLAGS_IN_PVP
Definition Player.h:477

References PvPInfo::EndTimer, GameTime::GetGameTime(), HasPlayerFlag(), PvPInfo::IsHostile, IsPvP(), PLAYER_FLAGS_IN_PVP, pvpInfo, UpdateFFAPvPState(), and UpdatePvP().

Referenced by AddQuest(), Spell::EffectQuestClear(), WorldSession::HandleQuestLogRemoveQuest(), RewardQuest(), Unit::SetCharm(), and UpdateZone().

◆ UpdateRangedHitChances()

◆ UpdateRating()

void Player::UpdateRating ( CombatRating  cr)
611{
612 int32 amount = m_baseRatingValue[cr];
613 // Apply bonus from SPELL_AURA_MOD_RATING_FROM_STAT
614 // stat used stored in miscValueB for this aura
615 AuraEffectList const& modRatingFromStat =
617 for (AuraEffectList::const_iterator i = modRatingFromStat.begin();
618 i != modRatingFromStat.end(); ++i)
619 if ((*i)->GetMiscValue() & (1 << cr))
620 amount += int32(CalculatePct(GetStat(Stats((*i)->GetMiscValueB())),
621 (*i)->GetAmount()));
622 if (amount < 0)
623 amount = 0;
624 SetUInt32Value(static_cast<uint16>(PLAYER_FIELD_COMBAT_RATING_1) + static_cast<uint16>(cr), uint32(amount));
625
626 bool affectStats = CanModifyStats();
627
628 switch (cr)
629 {
630 case CR_WEAPON_SKILL: // Implemented in Unit::RollMeleeOutcomeAgainst
631 case CR_DEFENSE_SKILL:
633 break;
634 case CR_DODGE:
636 break;
637 case CR_PARRY:
639 break;
640 case CR_BLOCK:
642 break;
643 case CR_HIT_MELEE:
645 break;
646 case CR_HIT_RANGED:
648 break;
649 case CR_HIT_SPELL:
651 break;
652 case CR_CRIT_MELEE:
653 if (affectStats)
654 {
657 }
658 break;
659 case CR_CRIT_RANGED:
660 if (affectStats)
662 break;
663 case CR_CRIT_SPELL:
664 if (affectStats)
666 break;
667 case CR_HIT_TAKEN_MELEE: // Implemented in Unit::MeleeMissChanceCalc
669 break;
670 case CR_HIT_TAKEN_SPELL: // Implemented in Unit::MagicSpellHitResult
671 break;
672 case CR_CRIT_TAKEN_MELEE: // Implemented in Unit::RollMeleeOutcomeAgainst
673 // (only for chance to crit)
675 break;
676 case CR_CRIT_TAKEN_SPELL: // Implemented in Unit::SpellCriticalBonus (only
677 // for chance to crit)
678 break;
679 case CR_HASTE_MELEE: // Implemented in Player::ApplyRatingMod
680 case CR_HASTE_RANGED:
681 case CR_HASTE_SPELL:
682 break;
683 case CR_WEAPON_SKILL_MAINHAND: // Implemented in
684 // Unit::RollMeleeOutcomeAgainst
687 break;
688 case CR_EXPERTISE:
689 if (affectStats)
690 {
693 }
694 break;
696 if (affectStats)
698 break;
699 }
700}
@ SPELL_AURA_MOD_RATING_FROM_STAT
Definition SpellAuraDefines.h:283
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:241
@ CR_WEAPON_SKILL
Definition Unit.h:219
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:240
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:239
void UpdateArmorPenetration(int32 amount)
Definition StatSystem.cpp:864
void UpdateSpellHitChances()
Definition StatSystem.cpp:882
void UpdateMeleeHitChances()
Definition StatSystem.cpp:870
void UpdateRangedHitChances()
Definition StatSystem.cpp:876

References BASE_ATTACK, CalculatePct(), Unit::CanModifyStats(), CR_ARMOR_PENETRATION, CR_BLOCK, CR_CRIT_MELEE, CR_CRIT_RANGED, CR_CRIT_SPELL, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CR_DEFENSE_SKILL, CR_DODGE, CR_EXPERTISE, CR_HASTE_MELEE, CR_HASTE_RANGED, CR_HASTE_SPELL, CR_HIT_MELEE, CR_HIT_RANGED, CR_HIT_SPELL, CR_HIT_TAKEN_MELEE, CR_HIT_TAKEN_RANGED, CR_HIT_TAKEN_SPELL, CR_PARRY, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, Unit::GetAuraEffectsByType(), Unit::GetStat(), m_baseRatingValue, OFF_ATTACK, PLAYER_FIELD_COMBAT_RATING_1, RANGED_ATTACK, Unit::SetUInt32Value(), SPELL_AURA_MOD_RATING_FROM_STAT, UpdateAllSpellCritChances(), UpdateArmorPenetration(), UpdateBlockPercentage(), UpdateCritPercentage(), UpdateDefenseBonusesMod(), UpdateDodgePercentage(), UpdateExpertise(), UpdateMeleeHitChances(), UpdateParryPercentage(), UpdateRangedHitChances(), and UpdateSpellHitChances().

Referenced by ApplyRatingMod(), and UpdateAllRatings().

◆ UpdateResistances()

void Player::UpdateResistances ( uint32  school)
overridevirtual

Implements Unit.

243{
244 if (school > SPELL_SCHOOL_NORMAL)
245 {
246 // cant use GetTotalAuraModValue because of total pct multiplier :P
247 float value = 0.0f;
248 UnitMods unitMod = UnitMods(UNIT_MOD_RESISTANCE_START + school);
249
250 value = GetModifierValue(unitMod, BASE_VALUE);
251 value *= GetModifierValue(unitMod, BASE_PCT);
252 value += GetModifierValue(unitMod, TOTAL_VALUE);
253
255 for(AuraEffectList::const_iterator i = mResbyIntellect.begin(); i != mResbyIntellect.end(); ++i)
256 {
257 if ((*i)->GetMiscValue() & (1 << (school - 1)))
258 value += int32(GetStat(Stats((*i)->GetMiscValueB())) * (*i)->GetAmount() / 100.0f);
259 }
260
261 value *= GetModifierValue(unitMod, TOTAL_PCT);
262
263 SetResistance(SpellSchools(school), int32(value));
264 }
265 else
266 UpdateArmor();
267}

References BASE_PCT, BASE_VALUE, Unit::GetAuraEffectsByType(), Unit::GetModifierValue(), Unit::GetStat(), Unit::SetResistance(), SPELL_AURA_MOD_RESISTANCE_OF_STAT_PERCENT, SPELL_SCHOOL_NORMAL, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_RESISTANCE_START, and UpdateArmor().

◆ UpdateRuneRegen()

void Player::UpdateRuneRegen ( RuneType  rune)
988{
989 if (rune >= NUM_RUNE_TYPES)
990 return;
991
992 uint32 cooldown = 0;
993
994 for (uint32 i = 0; i < MAX_RUNES; ++i)
995 if (GetBaseRune(i) == rune)
996 {
997 cooldown = GetRuneBaseCooldown(i, true);
998 break;
999 }
1000
1001 if (cooldown <= 0)
1002 return;
1003
1004 float regen = float(1 * IN_MILLISECONDS) / float(cooldown);
1005 SetFloatValue(PLAYER_RUNE_REGEN_1 + uint8(rune), regen);
1006}
uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace)
Definition Player.cpp:13416

References GetBaseRune(), GetRuneBaseCooldown(), IN_MILLISECONDS, MAX_RUNES, NUM_RUNE_TYPES, PLAYER_RUNE_REGEN_1, and Object::SetFloatValue().

Referenced by AuraEffect::HandleModPowerRegen().

◆ UpdateShieldBlockValue()

void Player::UpdateShieldBlockValue ( )
540{
542}
uint32 GetShieldBlockValue() const override
Definition Player.cpp:5105

References GetShieldBlockValue(), PLAYER_SHIELD_BLOCK, and Unit::SetUInt32Value().

Referenced by HandleBaseModValue(), UpdateAllStats(), and UpdateStats().

◆ UpdateSkill()

bool Player::UpdateSkill ( uint32  skill_id,
uint32  step 
)
710{
711 if (!skill_id || !sScriptMgr->OnPlayerCanUpdateSkill(this, skill_id))
712 return false;
713
714 SkillStatusMap::iterator itr = mSkillStatus.find(skill_id);
715 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
716 return false;
717
718 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
719 uint32 data = GetUInt32Value(valueIndex);
720 uint32 value = SKILL_VALUE(data);
721 uint32 max = SKILL_MAX(data);
722
723 sScriptMgr->OnPlayerBeforeUpdateSkill(this, skill_id, value, max, step);
724
725 if ((!max) || (!value) || (value >= max))
726 return false;
727
728 if (value < max)
729 {
730 uint32 new_value = value + step;
731 if (new_value > max)
732 new_value = max;
733
734 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, max));
735 if (itr->second.uState != SKILL_NEW)
736 itr->second.uState = SKILL_CHANGED;
737
738 UpdateSkillEnchantments(skill_id, value, new_value);
740 skill_id);
741
742 sScriptMgr->OnPlayerUpdateSkill(this, skill_id, value, max, step, new_value);
743 return true;
744 }
745
746 return false;
747}

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, sScriptMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateDefense(), and UpdateWeaponSkill().

◆ UpdateSkillEnchantments()

void Player::UpdateSkillEnchantments ( uint16  skill_id,
uint16  curr_value,
uint16  new_value 
)
4688{
4689 for (uint8 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
4690 {
4691 if (m_items[i])
4692 {
4693 for (uint8 slot = 0; slot < MAX_ENCHANTMENT_SLOT; ++slot)
4694 {
4695 uint32 ench_id = m_items[i]->GetEnchantmentId(EnchantmentSlot(slot));
4696 if (!ench_id)
4697 continue;
4698
4699 SpellItemEnchantmentEntry const* Enchant = sSpellItemEnchantmentStore.LookupEntry(ench_id);
4700 if (!Enchant)
4701 return;
4702
4703 if (Enchant->requiredSkill == skill_id)
4704 {
4705 // Checks if the enchantment needs to be applied or removed
4706 if (curr_value < Enchant->requiredSkillValue && new_value >= Enchant->requiredSkillValue)
4707 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4708 else if (new_value < Enchant->requiredSkillValue && curr_value >= Enchant->requiredSkillValue)
4709 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4710 }
4711
4712 // If we're dealing with a gem inside a prismatic socket we need to check the prismatic socket requirements
4713 // rather than the gem requirements itself. If the socket has no color it is a prismatic socket.
4715 && !m_items[i]->GetTemplate()->Socket[slot - SOCK_ENCHANTMENT_SLOT].Color)
4716 {
4717 SpellItemEnchantmentEntry const* pPrismaticEnchant = sSpellItemEnchantmentStore.LookupEntry(m_items[i]->GetEnchantmentId(PRISMATIC_ENCHANTMENT_SLOT));
4718
4719 if (pPrismaticEnchant && pPrismaticEnchant->requiredSkill == skill_id)
4720 {
4721 if (curr_value < pPrismaticEnchant->requiredSkillValue && new_value >= pPrismaticEnchant->requiredSkillValue)
4722 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), true);
4723 else if (new_value < pPrismaticEnchant->requiredSkillValue && curr_value >= pPrismaticEnchant->requiredSkillValue)
4724 ApplyEnchantment(m_items[i], EnchantmentSlot(slot), false);
4725 }
4726 }
4727 }
4728 }
4729 }
4730}
Definition Socket.h:52

References ApplyEnchantment(), Item::GetEnchantmentId(), INVENTORY_SLOT_BAG_END, m_items, MAX_ENCHANTMENT_SLOT, PRISMATIC_ENCHANTMENT_SLOT, SpellItemEnchantmentEntry::requiredSkill, SpellItemEnchantmentEntry::requiredSkillValue, SOCK_ENCHANTMENT_SLOT, SOCK_ENCHANTMENT_SLOT_2, SOCK_ENCHANTMENT_SLOT_3, and sSpellItemEnchantmentStore.

Referenced by SetSkill(), UpdateSkill(), and UpdateSkillPro().

◆ UpdateSkillPro()

bool Player::UpdateSkillPro ( uint16  SkillId,
int32  Chance,
uint32  step 
)
914{
915 LOG_DEBUG("entities.player.skills",
916 "UpdateSkillPro(SkillId {}, Chance {:3.1f}%)", SkillId,
917 Chance / 10.0f);
918 if (!SkillId || !sScriptMgr->OnPlayerCanUpdateSkill(this, SkillId))
919 return false;
920
921 if (Chance <= 0) // speedup in 0 chance case
922 {
923 LOG_DEBUG("entities.player.skills",
924 "Player::UpdateSkillPro Chance={:3.1f}% missed",
925 Chance / 10.0f);
926 return false;
927 }
928
929 SkillStatusMap::iterator itr = mSkillStatus.find(SkillId);
930 if (itr == mSkillStatus.end() || itr->second.uState == SKILL_DELETED)
931 return false;
932
933 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
934
935 uint32 data = GetUInt32Value(valueIndex);
936 uint32 SkillValue = SKILL_VALUE(data);
937 uint32 MaxValue = SKILL_MAX(data);
938
939 sScriptMgr->OnPlayerBeforeUpdateSkill(this, SkillId, SkillValue, MaxValue, step);
940
941 if (!MaxValue || !SkillValue || SkillValue >= MaxValue)
942 return false;
943
944 int32 Roll = irand(1, 1000);
945
946 if (Roll <= Chance)
947 {
948 uint32 new_value = SkillValue + step;
949 if (new_value > MaxValue)
950 new_value = MaxValue;
951
952 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(new_value, MaxValue));
953 if (itr->second.uState != SKILL_NEW)
954 itr->second.uState = SKILL_CHANGED;
955
956 for (std::size_t i = 0; i < bonusSkillLevelsSize; ++i)
957 {
958 uint32 bsl = bonusSkillLevels[i];
959 if (SkillValue < bsl && new_value >= bsl)
960 {
961 learnSkillRewardedSpells(SkillId, new_value);
962 break;
963 }
964 }
965 UpdateSkillEnchantments(SkillId, SkillValue, new_value);
967 SkillId);
968 LOG_DEBUG("entities.player.skills",
969 "Player::UpdateSkillPro Chance={:3.1f}% taken",
970 Chance / 10.0f);
971
972 sScriptMgr->OnPlayerUpdateSkill(this, SkillId, SkillValue, MaxValue, step, new_value);
973 return true;
974 }
975
976 LOG_DEBUG("entities.player.skills",
977 "Player::UpdateSkillPro Chance={:3.1f}% missed", Chance / 10.0f);
978 return false;
979}
static uint32 bonusSkillLevels[]
Definition PlayerUpdates.cpp:909
static const std::size_t bonusSkillLevelsSize
Definition PlayerUpdates.cpp:910
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
Definition Group.h:143

References ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, bonusSkillLevels, bonusSkillLevelsSize, Object::GetUInt32Value(), irand(), learnSkillRewardedSpells(), LOG_DEBUG, MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_MAX, SKILL_NEW, SKILL_VALUE, sScriptMgr, UpdateAchievementCriteria(), and UpdateSkillEnchantments().

Referenced by UpdateCraftSkill(), UpdateFishingSkill(), and UpdateGatherSkill().

◆ UpdateSkillsForLevel()

void Player::UpdateSkillsForLevel ( )

update only level dependent max skill values

maximize skill always

update max skill value if current max skill not maximized

1080{
1081 uint16 maxconfskill = sWorld->GetConfigMaxSkillValue();
1082 uint32 maxSkill = GetMaxSkillValueForLevel();
1083
1084 bool alwaysMaxSkill =
1086
1087 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1088 itr != mSkillStatus.end(); ++itr)
1089 {
1090 if (itr->second.uState == SKILL_DELETED)
1091 continue;
1092
1093 uint32 pskill = itr->first;
1094 SkillRaceClassInfoEntry const* rcEntry =
1096 if (!rcEntry)
1097 continue;
1098
1099 if (GetSkillRangeType(rcEntry) != SKILL_RANGE_LEVEL)
1100 continue;
1101
1102 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1103 uint32 data = GetUInt32Value(valueIndex);
1104 uint32 max = SKILL_MAX(data);
1105 uint32 val = SKILL_VALUE(data);
1106
1108 if (max != 1)
1109 {
1111 if (alwaysMaxSkill ||
1113 {
1114 SetUInt32Value(valueIndex,
1115 MAKE_SKILL_VALUE(maxSkill, maxSkill));
1116 if (itr->second.uState != SKILL_NEW)
1117 itr->second.uState = SKILL_CHANGED;
1118 }
1119 else if (max != maxconfskill)
1121 {
1122 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(val, maxSkill));
1123 if (itr->second.uState != SKILL_NEW)
1124 itr->second.uState = SKILL_CHANGED;
1125 }
1126 }
1127 }
1128}
@ CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL
Definition WorldConfig.h:54

References CONFIG_ALWAYS_MAX_SKILL_FOR_LEVEL, SkillRaceClassInfoEntry::Flags, Unit::getClass(), GetMaxSkillValueForLevel(), Unit::getRace(), GetSkillRaceClassInfo(), GetSkillRangeType(), Object::GetUInt32Value(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DELETED, SKILL_FLAG_ALWAYS_MAX_VALUE, SKILL_MAX, SKILL_NEW, SKILL_RANGE_LEVEL, SKILL_VALUE, and sWorld.

Referenced by GiveLevel(), InitStatsForLevel(), and LoadFromDB().

◆ UpdateSkillsToMaxSkillsForLevel()

void Player::UpdateSkillsToMaxSkillsForLevel ( )
1131{
1132 for (SkillStatusMap::iterator itr = mSkillStatus.begin();
1133 itr != mSkillStatus.end(); ++itr)
1134 {
1135 if (itr->second.uState == SKILL_DELETED)
1136 continue;
1137
1138 uint32 pskill = itr->first;
1139 if (IsProfessionOrRidingSkill(pskill))
1140 continue;
1141 uint32 valueIndex = PLAYER_SKILL_VALUE_INDEX(itr->second.pos);
1142 uint32 data = GetUInt32Value(valueIndex);
1143 uint32 max = SKILL_MAX(data);
1144
1145 if (max > 1)
1146 {
1147 SetUInt32Value(valueIndex, MAKE_SKILL_VALUE(max, max));
1148 if (itr->second.uState != SKILL_NEW)
1149 itr->second.uState = SKILL_CHANGED;
1150 }
1151 if (pskill == SKILL_DEFENSE)
1153 }
1154}

References Object::GetUInt32Value(), IsProfessionOrRidingSkill(), MAKE_SKILL_VALUE, mSkillStatus, PLAYER_SKILL_VALUE_INDEX, Unit::SetUInt32Value(), SKILL_CHANGED, SKILL_DEFENSE, SKILL_DELETED, SKILL_MAX, SKILL_NEW, and UpdateDefenseBonusesMod().

Referenced by GiveLevel(), and misc_commandscript::HandleMaxSkillCommand().

◆ UpdateSoulboundTradeItems()

void Player::UpdateSoulboundTradeItems ( )
4108{
4109 std::lock_guard<std::mutex> guard(m_soulboundTradableLock);
4110 if (m_itemSoulboundTradeable.empty())
4111 return;
4112
4113 // also checks for garbage data
4114 for (ItemDurationList::iterator itr = m_itemSoulboundTradeable.begin(); itr != m_itemSoulboundTradeable.end();)
4115 {
4116 ASSERT(*itr);
4117 if ((*itr)->GetOwnerGUID() != GetGUID())
4118 {
4119 m_itemSoulboundTradeable.erase(itr++);
4120 continue;
4121 }
4122 if ((*itr)->CheckSoulboundTradeExpire())
4123 {
4124 m_itemSoulboundTradeable.erase(itr++);
4125 continue;
4126 }
4127 ++itr;
4128 }
4129}

References ASSERT, Object::GetGUID(), m_itemSoulboundTradeable, and m_soulboundTradableLock.

Referenced by Update().

◆ UpdateSpeakTime()

void Player::UpdateSpeakTime ( ChatFloodThrottle::Index  index)
30{
31 // ignore chat spam protection for GMs in any mode
33 return;
34
35 uint32 limit, delay;
36 switch (index)
37 {
39 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT);
40 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY);
41 break;
43 limit = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_COUNT);
44 delay = sWorld->getIntConfig(CONFIG_CHATFLOOD_MESSAGE_DELAY);
45 [[fallthrough]];
46 default:
47 return;
48 }
49 time_t current = GameTime::GetGameTime().count();
50 if (m_chatFloodData[index].Time > current)
51 {
52 ++m_chatFloodData[index].Count;
53 if (m_chatFloodData[index].Count >= limit)
54 {
55 // prevent overwrite mute time, if message send just before mutes set, for example.
56 time_t new_mute = current + sWorld->getIntConfig(CONFIG_CHATFLOOD_MUTE_TIME);
57 if (GetSession()->m_muteTime < new_mute)
58 GetSession()->m_muteTime = new_mute;
59
60 m_chatFloodData[index].Count = 0;
61 }
62 }
63 else
64 m_chatFloodData[index].Count = 1;
65
66 m_chatFloodData[index].Time = current + delay;
67}
@ CONFIG_CHATFLOOD_MUTE_TIME
Definition WorldConfig.h:233
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT
Definition WorldConfig.h:231
@ CONFIG_CHATFLOOD_MESSAGE_DELAY
Definition WorldConfig.h:230
@ CONFIG_CHATFLOOD_MESSAGE_COUNT
Definition WorldConfig.h:229
@ CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY
Definition WorldConfig.h:232
std::array< ChatFloodThrottle, ChatFloodThrottle::MAX > m_chatFloodData
Definition Player.h:2793
@ ADDON
Definition Player.h:2322
@ REGULAR
Definition Player.h:2321

References Player::ChatFloodThrottle::ADDON, CONFIG_CHATFLOOD_ADDON_MESSAGE_COUNT, CONFIG_CHATFLOOD_ADDON_MESSAGE_DELAY, CONFIG_CHATFLOOD_MESSAGE_COUNT, CONFIG_CHATFLOOD_MESSAGE_DELAY, CONFIG_CHATFLOOD_MUTE_TIME, GameTime::GetGameTime(), GetSession(), AccountMgr::IsPlayerAccount(), m_chatFloodData, WorldSession::m_muteTime, Player::ChatFloodThrottle::REGULAR, and sWorld.

Referenced by WorldSession::HandleMessagechatOpcode(), and WorldSession::HandleTextEmoteOpcode().

◆ UpdateSpecCount()

void Player::UpdateSpecCount ( uint8  count)
2178{
2179 uint32 curCount = GetSpecsCount();
2180 if (curCount == count)
2181 return;
2182
2183 if (m_activeSpec >= count)
2184 ActivateSpec(0);
2185
2186 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
2187 CharacterDatabasePreparedStatement* stmt = nullptr;
2188
2189 // Copy spec data
2190 if (count > curCount)
2191 {
2192 _SaveActions(trans); // make sure the button list is cleaned up
2193 for (ActionButtonList::iterator itr = m_actionButtons.begin();
2194 itr != m_actionButtons.end(); ++itr)
2195 {
2196 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACTION);
2197 stmt->SetData(0, GetGUID().GetCounter());
2198 stmt->SetData(1, 1);
2199 stmt->SetData(2, itr->first);
2200 stmt->SetData(3, itr->second.GetAction());
2201 stmt->SetData(4, uint8(itr->second.GetType()));
2202 trans->Append(stmt);
2203 }
2204 }
2205 // Delete spec data for removed spec.
2206 else if (count < curCount)
2207 {
2208 _SaveActions(trans);
2209
2210 stmt = CharacterDatabase.GetPreparedStatement(
2212 stmt->SetData(0, m_activeSpec);
2213 stmt->SetData(1, GetGUID().GetCounter());
2214 trans->Append(stmt);
2215
2216 m_activeSpec = 0;
2217 }
2218
2219 CharacterDatabase.CommitTransaction(trans);
2220
2221 SetSpecsCount(count);
2222
2223 SendTalentsInfoData(false);
2224}
@ CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC
Definition CharacterDatabase.h:459
void ActivateSpec(uint8 spec)
Definition Player.cpp:15187
void SetSpecsCount(uint8 count)
Definition Player.h:1740

References _SaveActions(), ActivateSpec(), CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, CHAR_INS_CHAR_ACTION, CharacterDatabase, ObjectGuid::GetCounter(), Object::GetGUID(), GetSpecsCount(), m_actionButtons, m_activeSpec, SendTalentsInfoData(), PreparedStatementBase::SetData(), and SetSpecsCount().

◆ UpdateSpellCritChance()

void Player::UpdateSpellCritChance ( uint32  school)
840{
841 // For normal school set zero crit chance
842 if (school == SPELL_SCHOOL_NORMAL)
843 {
845 return;
846 }
847 // For others recalculate it from:
848 float crit = 0.0f;
849 // Crit from Intellect
851 // Increase crit from SPELL_AURA_MOD_SPELL_CRIT_CHANCE
853 // Increase crit from SPELL_AURA_MOD_CRIT_PCT
855 // Increase crit by school from SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
857 // Increase crit from spell crit ratings
859
860 // Store crit value
862}
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
float GetSpellCritFromIntellect()
Definition Player.cpp:5184
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6060
int32 GetTotalAuraModifierAreaExclusive(AuraType auratype) const
Definition Unit.cpp:5989

References CR_CRIT_SPELL, GetRatingBonusValue(), GetSpellCritFromIntellect(), Unit::GetTotalAuraModifier(), Unit::GetTotalAuraModifierAreaExclusive(), Unit::GetTotalAuraModifierByMiscMask(), PLAYER_SPELL_CRIT_PERCENTAGE1, Object::SetFloatValue(), SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by AuraEffect::HandleModSpellCritChanceShool(), and UpdateAllSpellCritChances().

◆ UpdateSpellDamageAndHealingBonus()

void Player::UpdateSpellDamageAndHealingBonus ( )
195{
196 // Magic damage modifiers implemented in Unit::SpellDamageBonusDone
197 // This information for client side use only
198 // Get healing bonus for all schools
200 // Get damage bonus for all schools
201 for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i)
203}
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:787
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12780
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12014

References MAX_SPELL_SCHOOL, PLAYER_FIELD_MOD_DAMAGE_DONE_POS, PLAYER_FIELD_MOD_HEALING_DONE_POS, Object::SetStatInt32Value(), SPELL_SCHOOL_HOLY, SPELL_SCHOOL_MASK_ALL, Unit::SpellBaseDamageBonusDone(), and Unit::SpellBaseHealingBonusDone().

Referenced by AuraEffect::HandleModHealingDone(), AuraEffect::HandleModSpellDamagePercentFromAttackPower(), AuraEffect::HandleModSpellDamagePercentFromStat(), AuraEffect::HandleModSpellHealingPercentFromAttackPower(), AuraEffect::HandleModSpellHealingPercentFromStat(), UpdateAllStats(), UpdateAttackPowerAndDamage(), and UpdateStats().

◆ UpdateSpellHitChances()

void Player::UpdateSpellHitChances ( )

◆ UpdateStats()

bool Player::UpdateStats ( Stats  stat)
overridevirtual

Implements Unit.

98{
99 if (stat > STAT_SPIRIT)
100 return false;
101
102 // value = ((base_value * base_pct) + total_value) * total_pct
103 float value = GetTotalStatValue(stat);
104
105 SetStat(stat, int32(value));
106
107 switch (stat)
108 {
109 case STAT_STRENGTH:
111 break;
112 case STAT_AGILITY:
113 UpdateArmor();
116 break;
117 case STAT_STAMINA:
119 break;
120 case STAT_INTELLECT:
123 UpdateArmor(); //SPELL_AURA_MOD_RESISTANCE_OF_INTELLECT_PERCENT, only armor currently
124 break;
125 default:
126 break;
127 }
128
129 if (stat == STAT_STRENGTH)
130 {
134 }
135 else if (stat == STAT_AGILITY)
136 {
139 }
140 else
141 {
142 // Need update (exist AP from stat auras)
147 }
148
151
152 // Update ratings in exist SPELL_AURA_MOD_RATING_FROM_STAT and only depends from stat
153 uint32 mask = 0;
155 for (AuraEffectList::const_iterator i = modRatingFromStat.begin(); i != modRatingFromStat.end(); ++i)
156 if (Stats((*i)->GetMiscValueB()) == stat)
157 mask |= (*i)->GetMiscValue();
158 if (mask)
159 {
160 for (uint32 rating = 0; rating < MAX_COMBAT_RATING; ++rating)
161 if (mask & (1 << rating))
162 ApplyRatingMod(CombatRating(rating), 0, true);
163 }
164 return true;
165}

References ApplyRatingMod(), Unit::GetAuraEffectsByType(), Unit::GetTotalStatValue(), Unit::HasAuraTypeWithMiscvalue(), MAX_COMBAT_RATING, POWER_MANA, Unit::SetStat(), SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RANGED_ATTACK_POWER_OF_STAT_PERCENT, SPELL_AURA_MOD_RATING_FROM_STAT, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UpdateAllCritPercentages(), UpdateAllSpellCritChances(), UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDodgePercentage(), UpdateManaRegen(), UpdateMaxHealth(), UpdateMaxPower(), UpdateShieldBlockValue(), and UpdateSpellDamageAndHealingBonus().

◆ UpdateTitansGrip()

void Player::UpdateTitansGrip ( )

◆ UpdateTriggerVisibility()

void Player::UpdateTriggerVisibility ( )
1733{
1734 if (!IsInWorld())
1735 return;
1736
1737 if (GetObjectVisibilityContainer().GetVisibleWorldObjectsMap()->empty())
1738 return;
1739
1740 UpdateData udata;
1741 DoForAllVisibleWorldObjects([this, &udata](WorldObject* worldObject)
1742 {
1743 if (worldObject->IsCreature())
1744 {
1745 Creature* creature = worldObject->ToCreature();
1746 // Update fields of triggers, transformed units or unselectable
1747 // units (values dependent on GM state)
1748 if (!creature || (!creature->IsTrigger() &&
1749 !creature->HasTransformAura() &&
1750 !creature->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)))
1751 return;
1752
1753 creature->SetFieldNotifyFlag(UF_FLAG_PUBLIC);
1754 creature->BuildValuesUpdateBlockForPlayer(&udata, this);
1755 creature->RemoveFieldNotifyFlag(UF_FLAG_PUBLIC);
1756 }
1757 else if (worldObject->IsGameObject())
1758 {
1759 GameObject* go = worldObject->ToGameObject();
1760 if (!go)
1761 return;
1762
1763 go->SetFieldNotifyFlag(UF_FLAG_PUBLIC);
1764 go->BuildValuesUpdateBlockForPlayer(&udata, this);
1765 go->RemoveFieldNotifyFlag(UF_FLAG_PUBLIC);
1766 }
1767 });
1768
1769 if (!udata.HasData())
1770 return;
1771
1772 WorldPacket packet;
1773 udata.BuildPacket(packet);
1774 SendDirectMessage(&packet);
1775}

References UpdateData::BuildPacket(), WorldObject::DoForAllVisibleWorldObjects(), WorldObject::GetObjectVisibilityContainer(), UpdateData::HasData(), Object::IsCreature(), Object::IsGameObject(), Object::IsInWorld(), and SendDirectMessage().

Referenced by gm_commandscript::HandleGMOffCommand(), and gm_commandscript::HandleGMOnCommand().

◆ UpdateVisibilityForPlayer()

void Player::UpdateVisibilityForPlayer ( bool  mapChange = false)
1589{
1590 // After added to map seer must be a player - there is no possibility to
1591 // still have different seer (all charm auras must be already removed)
1592 if (mapChange && m_seer != this)
1593 m_seer = this;
1594
1595 Acore::VisibleNotifier notifier(*this, mapChange);
1598 notifier.SendToSelf();
1599
1600 if (mapChange)
1601 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
1602}
#define VISIBILITY_DISTANCE_GIGANTIC
Definition ObjectDefines.h:34
Position m_last_notify_position
Definition Unit.h:2064
Definition GridNotifiers.h:44
static void VisitFarVisibleObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185

References GetSightRange(), Unit::m_last_notify_position, m_seer, Position::Relocate(), Acore::VisibleNotifier::SendToSelf(), VISIBILITY_DISTANCE_GIGANTIC, Cell::VisitFarVisibleObjects(), and Cell::VisitObjects().

Referenced by WorldSession::HandleFarSightOpcode(), SendInitialPacketsAfterAddToMap(), and UpdateObjectVisibility().

◆ UpdateVisibilityOf() [1/2]

template<class T >
void Player::UpdateVisibilityOf ( T *  target,
UpdateData data,
std::vector< Unit * > &  visibleNow 
)
1669{
1671
1672 if (HaveAtClient(target))
1673 {
1674 if (!CanSeeOrDetect(target, false, true))
1675 {
1676 BeforeVisibilityDestroy<T>(target, this);
1677
1678 target->BuildOutOfRangeUpdateBlock(&data);
1680 }
1681 }
1682 else
1683 {
1684 if (CanSeeOrDetect(target, false, true))
1685 {
1686 target->BuildCreateUpdateBlockForPlayer(&data, this);
1687 UpdateVisibilityOf_helper(this, target, visibleNow);
1688 }
1689 }
1690}
void UpdateVisibilityOf_helper(Player *player, T *target, std::vector< Unit * > &)
Definition PlayerUpdates.cpp:1625
void AddObjectToPendingUpdateList(WorldObject *obj)
Definition Map.cpp:565
void UnlinkWorldObjectVisibility(WorldObject *worldObject)
Definition ObjectVisibilityContainer.cpp:81
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1733

References Map::AddObjectToPendingUpdateList(), WorldObject::CanSeeOrDetect(), WorldObject::GetMap(), WorldObject::GetObjectVisibilityContainer(), HaveAtClient(), ObjectVisibilityContainer::UnlinkWorldObjectVisibility(), and UpdateVisibilityOf_helper().

◆ UpdateVisibilityOf() [2/2]

void Player::UpdateVisibilityOf ( WorldObject target)
1704{
1705 if (HaveAtClient(target))
1706 {
1707 if (!CanSeeOrDetect(target, false, true))
1708 {
1709 if (target->IsCreature())
1711
1712 target->DestroyForPlayer(this);
1714 }
1715 }
1716 else
1717 {
1718 if (CanSeeOrDetect(target, false, true))
1719 {
1720 target->SendUpdateToPlayer(this);
1722
1723 // target aura duration for caster show only if target exist at
1724 // caster client send data at target visibility change (adding to
1725 // client)
1726 if (target->IsUnit())
1727 GetInitialVisiblePackets((Unit*) target);
1728 }
1729 }
1730}
void BeforeVisibilityDestroy< Creature >(Creature *t, Player *p)
Definition PlayerUpdates.cpp:1660
void LinkWorldObjectVisibility(WorldObject *worldObject)
Definition ObjectVisibilityContainer.cpp:63
void GetInitialVisiblePackets(Unit *target)
Definition PlayerUpdates.cpp:1692

References BeforeVisibilityDestroy< Creature >(), WorldObject::CanSeeOrDetect(), Object::DestroyForPlayer(), GetInitialVisiblePackets(), WorldObject::GetObjectVisibilityContainer(), HaveAtClient(), Object::IsCreature(), Object::IsUnit(), ObjectVisibilityContainer::LinkWorldObjectVisibility(), Object::SendUpdateToPlayer(), Object::ToCreature(), and ObjectVisibilityContainer::UnlinkWorldObjectVisibility().

Referenced by instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), Acore::VisibleNotifier::SendToSelf(), SetViewpoint(), Acore::VisibleNotifier::Visit(), Acore::PlayerRelocationNotifier::Visit(), Acore::CreatureRelocationNotifier::Visit(), and Acore::VisibleNotifier::Visit().

◆ UpdateWeaponSkill()

void Player::UpdateWeaponSkill ( Unit victim,
WeaponAttackType  attType,
Item item = nullptr 
)
982{
983 if (IsInFeralForm())
984 return; // always maximized SKILL_FERAL_COMBAT in fact
985
987 return; // use weapon but not skill up
988
990 return;
991
992 uint32 weapon_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_WEAPON);
993
994 Item* tmpitem = GetWeaponForAttack(attType, true);
995 if (item && item != tmpitem && !item->IsBroken())
996 {
997 tmpitem = item;
998 }
999
1000 if (!tmpitem && attType == BASE_ATTACK)
1001 {
1002 // Keep unarmed & fist weapon skills in sync
1003 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
1004 UpdateSkill(SKILL_FIST_WEAPONS, weapon_skill_gain);
1005 }
1006 else if (tmpitem && tmpitem->GetTemplate()->SubClass !=
1008 {
1009 switch (tmpitem->GetTemplate()->SubClass)
1010 {
1012 break;
1014 UpdateSkill(SKILL_UNARMED, weapon_skill_gain);
1015 [[fallthrough]];
1016 default:
1017 UpdateSkill(tmpitem->GetSkill(), weapon_skill_gain);
1018 break;
1019 }
1020 }
1021
1023}
@ CREATURE_FLAG_EXTRA_NO_SKILL_GAINS
Definition CreatureData.h:63
@ ITEM_SUBCLASS_WEAPON_FIST
Definition ItemTemplate.h:357
@ FORM_TREE
Definition UnitDefines.h:71
@ CONFIG_SKILL_GAIN_WEAPON
Definition WorldConfig.h:226

References BASE_ATTACK, CONFIG_SKILL_GAIN_WEAPON, CREATURE_FLAG_EXTRA_NO_SKILL_GAINS, FORM_TREE, Unit::GetShapeshiftForm(), Item::GetSkill(), Item::GetTemplate(), GetWeaponForAttack(), Creature::HasFlagsExtra(), Item::IsBroken(), Object::IsCreature(), Unit::IsInFeralForm(), ITEM_SUBCLASS_WEAPON_FISHING_POLE, ITEM_SUBCLASS_WEAPON_FIST, SKILL_FIST_WEAPONS, SKILL_UNARMED, ItemTemplate::SubClass, sWorld, Object::ToCreature(), UpdateAllCritPercentages(), and UpdateSkill().

Referenced by UpdateCombatSkills().

◆ UpdateZone()

void Player::UpdateZone ( uint32  newZone,
uint32  newArea,
bool  force = false 
)
1253{
1254 if (!newZone)
1255 return;
1256
1257 if (m_zoneUpdateId != newZone || force)
1258 {
1259 sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1260 sOutdoorPvPMgr->HandlePlayerEnterZone(this, newZone);
1261 sWorldState->HandlePlayerLeaveZone(this, static_cast<AreaTableIDs>(m_zoneUpdateId));
1262 sWorldState->HandlePlayerEnterZone(this, static_cast<AreaTableIDs>(newZone));
1263 }
1264 if (m_zoneUpdateId != newZone)
1265 {
1266 sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
1267 sBattlefieldMgr->HandlePlayerEnterZone(this, newZone);
1268 SendInitWorldStates(newZone,
1269 newArea); // only if really enters to new zone, not
1270 // just area change, works strange...
1271 if (Guild* guild = GetGuild())
1272 guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
1273 }
1274
1276
1277 // group update
1278 if (GetGroup())
1280
1281 m_zoneUpdateId = newZone;
1283
1284 // zone changed, so area changed as well, update it
1285 UpdateArea(newArea);
1286
1287 AreaTableEntry const* zone = sAreaTableStore.LookupEntry(newZone);
1288 if (!zone)
1289 return;
1290
1291 if (sWorld->getBoolConfig(CONFIG_WEATHER))
1293
1294 GetMap()->SendZoneDynamicInfo(newZone, this);
1295
1296 sScriptMgr->OnPlayerUpdateZone(this, newZone, newArea);
1297
1298 // in PvP, any not controlled zone (except zone->team == 6, default case)
1299 // in PvE, only opposition team capital
1300 switch (zone->team)
1301 {
1302 case AREATEAM_ALLY:
1304 GetTeamId(true) != TEAM_ALLIANCE &&
1305 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1306 break;
1307 case AREATEAM_HORDE:
1309 GetTeamId(true) != TEAM_HORDE &&
1310 (sWorld->IsPvPRealm() || zone->flags & AREA_FLAG_CAPITAL);
1311 break;
1312 case AREATEAM_NONE:
1313 // overwrite for battlegrounds, maybe batter some zone flags but current
1314 // known not 100% fit to this
1315 pvpInfo.IsInHostileArea = sWorld->IsPvPRealm() || InBattleground() ||
1317 break;
1318 default: // 6 in fact
1319 pvpInfo.IsInHostileArea = false;
1320 break;
1321 }
1322
1323 // Treat players having a quest flagging for PvP as always in hostile area
1325
1326 if (zone->flags & AREA_FLAG_CAPITAL) // Is in a capital city
1327 {
1328 if (!pvpInfo.IsHostile || zone->IsSanctuary())
1330
1331 pvpInfo.IsInNoPvPArea = true;
1332 }
1333 else
1334 RemoveRestFlag(REST_FLAG_IN_CITY); // Recently left a capital city
1335
1337
1338 // remove items with area/map limitations (delete only for alive player to
1339 // allow back in ghost mode) if player resurrected at teleport this will be
1340 // applied in resurrect code
1341 if (IsAlive())
1342 DestroyZoneLimitedItem(true, newZone);
1343
1344 // check some item equip limitations (in result lost CanTitanGrip at talent
1345 // reset, for example)
1347
1348 // recent client version not send leave/join channel packets for built-in
1349 // local channels
1350 UpdateLocalChannels(newZone);
1351
1352 UpdateZoneDependentAuras(newZone);
1353}
@ AREATEAM_HORDE
Definition DBCEnums.h:58
@ AREATEAM_NONE
Definition DBCEnums.h:56
@ AREATEAM_ALLY
Definition DBCEnums.h:57
@ AREA_FLAG_CAPITAL
Definition DBCEnums.h:242
@ AREA_FLAG_WINTERGRASP
Definition DBCEnums.h:258
@ GROUP_UPDATE_FULL
Definition Group.h:121
@ GUILD_MEMBER_DATA_ZONEID
Definition Guild.h:58
@ REST_FLAG_IN_CITY
Definition Player.h:810
@ CONFIG_WEATHER
Definition WorldConfig.h:53
void SendZoneDynamicInfo(uint32 zoneId, Player *player) const
Definition Map.cpp:2792
Weather * GetOrGenerateZoneDefaultWeather(uint32 zoneId)
Definition Map.cpp:2871
void UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone)
Definition Map.cpp:415
void UpdateLocalChannels(uint32 newZone)
Definition PlayerUpdates.cpp:502
void SendInitWorldStates(uint32 zoneId, uint32 areaId)
Definition Player.cpp:8246
void DestroyZoneLimitedItem(bool update, uint32 new_zone)
Definition PlayerStorage.cpp:3311
uint32 team
Definition DBCStructure.h:529

References AREA_FLAG_CAPITAL, AREA_FLAG_WINTERGRASP, AREATEAM_ALLY, AREATEAM_HORDE, AREATEAM_NONE, AutoUnequipOffhandIfNeed(), CONFIG_WEATHER, DestroyZoneLimitedItem(), AreaTableEntry::flags, GetGroup(), GetGuild(), WorldObject::GetMap(), Map::GetOrGenerateZoneDefaultWeather(), GetTeamId(), GROUP_UPDATE_FULL, GUILD_MEMBER_DATA_ZONEID, HasPvPForcingQuest(), InBattleground(), Unit::IsAlive(), PvPInfo::IsHostile, PvPInfo::IsInHostileArea, PvPInfo::IsInNoPvPArea, AreaTableEntry::IsSanctuary(), m_zoneUpdateId, m_zoneUpdateTimer, pvpInfo, RemoveRestFlag(), REST_FLAG_IN_CITY, sAreaTableStore, sBattlefieldMgr, SendInitWorldStates(), Map::SendZoneDynamicInfo(), SetGroupUpdateFlag(), SetRestFlag(), sOutdoorPvPMgr, sScriptMgr, sWorld, sWorldState, AreaTableEntry::team, TEAM_ALLIANCE, TEAM_HORDE, UpdateArea(), UpdateLocalChannels(), Map::UpdatePlayerZoneStats(), UpdatePvPState(), UpdateZoneDependentAuras(), and ZONE_UPDATE_INTERVAL.

Referenced by WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), ResurrectPlayer(), SendInitialPacketsAfterAddToMap(), Update(), and UpdatePosition().

◆ UpdateZoneDependentAuras()

void Player::UpdateZoneDependentAuras ( uint32  zone_id)
1840{
1841 // Some spells applied at enter into zone (with subzones), aura removed in
1842 // UpdateAreaDependentAuras that called always at zone->area update
1843 SpellAreaForAreaMapBounds saBounds =
1844 sSpellMgr->GetSpellAreaForAreaMapBounds(newZone);
1845 for (SpellAreaForAreaMap::const_iterator itr = saBounds.first;
1846 itr != saBounds.second; ++itr)
1847 if (itr->second->autocast &&
1848 itr->second->IsFitToRequirements(this, newZone, 0))
1849 if (!HasAura(itr->second->spellId))
1850 CastSpell(this, itr->second->spellId, true);
1851}

References Unit::CastSpell(), Unit::HasAura(), and sSpellMgr.

Referenced by AddQuest(), CompleteQuest(), WorldSession::HandlePlayerLoginFromDB(), IncompleteQuest(), RemoveActiveQuest(), RewardQuest(), and UpdateZone().

◆ VehicleSpellInitialize()

void Player::VehicleSpellInitialize ( )
9653{
9654 Creature* vehicle = GetVehicleCreatureBase();
9655 if (!vehicle)
9656 return;
9657
9658 uint8 cooldownCount = vehicle->m_CreatureSpellCooldowns.size();
9659
9660 WorldPacket data(SMSG_PET_SPELLS, 8 + 2 + 4 + 4 + 4 * 10 + 1 + 1 + cooldownCount * (4 + 2 + 4 + 4));
9661 data << vehicle->GetGUID(); // Guid
9662 data << uint16(0); // Pet Family (0 for all vehicles)
9663 data << uint32(vehicle->IsSummon() ? vehicle->ToTempSummon()->GetTimer() : 0); // Duration
9664 // The following three segments are read by the client as one uint32
9665 data << uint8(vehicle->GetReactState()); // React State
9666 data << uint8(0); // Command State
9667 data << uint16(0x800); // DisableActions (set for all vehicles)
9668
9669 for (uint32 i = 0; i < MAX_CREATURE_SPELLS; ++i)
9670 {
9671 uint32 spellId = vehicle->m_spells[i];
9672 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
9673 if (!spellInfo)
9674 {
9675 data << uint16(0) << uint8(0) << uint8(i + 8);
9676 continue;
9677 }
9678
9679 ConditionList conditions = sConditionMgr->GetConditionsForVehicleSpell(vehicle->GetEntry(), spellId);
9680 if (!sConditionMgr->IsObjectMeetToConditions(this, vehicle, conditions))
9681 {
9682 LOG_DEBUG("condition", "VehicleSpellInitialize: conditions not met for Vehicle entry {} spell {}", vehicle->ToCreature()->GetEntry(), spellId);
9683 data << uint16(0) << uint8(0) << uint8(i + 8);
9684 continue;
9685 }
9686
9687 if (spellInfo->IsPassive())
9688 vehicle->CastSpell(vehicle, spellId, true);
9689
9690 data << uint32(MAKE_UNIT_ACTION_BUTTON(spellId, i + 8));
9691 }
9692
9694 data << uint32(0);
9695
9696 data << uint8(0); // Auras?
9697
9698 // Cooldowns
9699 data << uint8(cooldownCount);
9700
9701 uint32 curTime = GameTime::GetGameTimeMS().count();
9703
9704 for (CreatureSpellCooldowns::const_iterator itr = vehicle->m_CreatureSpellCooldowns.begin(); itr != vehicle->m_CreatureSpellCooldowns.end(); ++itr)
9705 {
9706 uint16 category = itr->second.category;
9707 uint32 cooldown = (itr->second.end > curTime) ? itr->second.end - curTime : 0;
9708
9709 data << uint32(itr->first); // spellid
9710 data << uint16(itr->second.category); // spell category
9711
9712 // send infinity cooldown in special format
9713 if (itr->second.end >= infTime)
9714 {
9715 data << uint32(1); // cooldown
9716 data << uint32(0x80000000); // category cooldown
9717 continue;
9718 }
9719
9720 data << uint32(category ? 0 : cooldown); // cooldown
9721 data << uint32(category ? cooldown : 0); // category cooldown
9722 }
9723
9724 SendDirectMessage(&data);
9725}
#define MAX_SPELL_CONTROL_BAR
Definition CharmInfo.h:27
static constexpr uint32 MAX_CREATURE_SPELLS
Definition Unit.h:47
uint32 m_spells[MAX_CREATURE_SPELLS]
Definition Creature.h:253
uint32 GetTimer()
Definition TemporarySummon.h:58
Creature * GetVehicleCreatureBase() const
Definition Unit.cpp:18778
TempSummon * ToTempSummon()
Definition Unit.h:716
bool IsSummon() const
Definition Unit.h:777

References Unit::CastSpell(), Object::GetEntry(), GameTime::GetGameTimeMS(), Object::GetGUID(), Creature::GetReactState(), TempSummon::GetTimer(), Unit::GetVehicleCreatureBase(), infinityCooldownDelayCheck, SpellInfo::IsPassive(), Unit::IsSummon(), LOG_DEBUG, Creature::m_CreatureSpellCooldowns, Creature::m_spells, MAKE_UNIT_ACTION_BUTTON, MAX_CREATURE_SPELLS, MAX_SPELL_CONTROL_BAR, sConditionMgr, SendDirectMessage(), SMSG_PET_SPELLS, sSpellMgr, Object::ToCreature(), and Unit::ToTempSummon().

Referenced by Unit::SetCharmedBy().

◆ VisualizeItem()

void Player::VisualizeItem ( uint8  slot,
Item pItem 
)
2876{
2877 if (!pItem)
2878 return;
2879
2880 // check also BIND_WHEN_PICKED_UP and BIND_QUEST_ITEM for .additem or .additemset case by GM (not binded at adding to inventory)
2882 pItem->SetBinding(true);
2883
2884 LOG_DEBUG("entities.player.items", "STORAGE: EquipItem slot = {}, item = {}", slot, pItem->GetEntry());
2885
2886 m_items[slot] = pItem;
2887 SetGuidValue(PLAYER_FIELD_INV_SLOT_HEAD + (slot * 2), pItem->GetGUID());
2890 pItem->SetSlot(slot);
2891 pItem->SetContainer(nullptr);
2892
2893 if (slot < EQUIPMENT_SLOT_END)
2894 SetVisibleItemSlot(slot, pItem);
2895
2896 pItem->SetState(ITEM_CHANGED, this);
2897}

References BIND_QUEST_ITEM, BIND_WHEN_EQUIPPED, BIND_WHEN_PICKED_UP, ItemTemplate::Bonding, EQUIPMENT_SLOT_END, Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), Item::GetTemplate(), ITEM_CHANGED, ITEM_FIELD_CONTAINED, ITEM_FIELD_OWNER, LOG_DEBUG, m_items, PLAYER_FIELD_INV_SLOT_HEAD, Item::SetBinding(), Item::SetContainer(), Object::SetGuidValue(), Item::SetSlot(), Item::SetState(), and SetVisibleItemSlot().

Referenced by EquipItem(), and QuickEquipItem().

◆ Whisper() [1/2]

void Player::Whisper ( std::string_view  text,
Language  language,
Player receiver,
bool  = false 
)
overridevirtual

Handles whispers from Addons and players based on sender, receiver's guid and language.

Reimplemented from Unit.

9486{
9487 ASSERT(target);
9488
9489 bool isAddonMessage = language == LANG_ADDON;
9490
9491 if (!isAddonMessage) // if not addon data
9492 language = LANG_UNIVERSAL; // whispers should always be readable
9493
9494 std::string _text(text);
9495
9496 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_WHISPER, language, _text, target))
9497 {
9498 return;
9499 }
9500
9501 sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, language, _text, target);
9502
9503 WorldPacket data;
9504 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, language, this, this, _text);
9505 target->SendDirectMessage(&data);
9506
9507 // rest stuff shouldn't happen in case of addon message
9508 if (isAddonMessage)
9509 return;
9510
9511 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text);
9512 SendDirectMessage(&data);
9513
9514 if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster())
9515 {
9516 SetAcceptWhispers(true);
9518 }
9519
9520 // announce afk or dnd message
9521 if (target->isAFK())
9522 {
9523 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_AFK, target->GetName(), target->autoReplyMsg);
9524 }
9525 else if (target->isDND())
9526 {
9527 ChatHandler(GetSession()).PSendSysMessage(LANG_PLAYER_DND, target->GetName(), target->autoReplyMsg);
9528 }
9529}
@ LANG_PLAYER_DND
Definition Language.h:678
@ LANG_PLAYER_AFK
Definition Language.h:679
@ LANG_COMMAND_WHISPERON
Definition Language.h:335
@ CHAT_MSG_WHISPER_INFORM
Definition SharedDefines.h:3411
@ CHAT_MSG_WHISPER
Definition SharedDefines.h:3409
Language
Definition SharedDefines.h:745
@ LANG_ADDON
Definition SharedDefines.h:764
bool isAcceptWhispers() const
Definition Player.h:1159

References ASSERT, autoReplyMsg, ChatHandler::BuildChatPacket(), CHAT_MSG_WHISPER, CHAT_MSG_WHISPER_INFORM, WorldObject::GetName(), GetSession(), isAcceptWhispers(), isAFK(), isDND(), IsGameMaster(), LANG_ADDON, LANG_COMMAND_WHISPERON, LANG_PLAYER_AFK, LANG_PLAYER_DND, LANG_UNIVERSAL, ChatHandler::PSendSysMessage(), SendDirectMessage(), ChatHandler::SendSysMessage(), SetAcceptWhispers(), and sScriptMgr.

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Whisper() [2/2]

void Player::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
overridevirtual

Reimplemented from Unit.

9532{
9533 if (!target)
9534 return;
9535
9536 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
9537 if (!bct)
9538 {
9539 LOG_ERROR("entities.unit", "Player::Whisper: `broadcast_text` was not {} found", textId);
9540 return;
9541 }
9542
9544 WorldPacket data;
9545 if (isBossWhisper)
9546 ChatHandler::BuildChatPacket(data, CHAT_MSG_RAID_BOSS_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9547 else
9548 ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
9549 target->SendDirectMessage(&data);
9550}
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3444
std::string const & GetText(LocaleConstant locale=DEFAULT_LOCALE, uint8 gender=GENDER_MALE, bool forceGender=false) const
Definition ObjectMgr.h:456

References ChatHandler::BuildChatPacket(), CHAT_MSG_RAID_BOSS_WHISPER, CHAT_MSG_WHISPER, Unit::getGender(), GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Player::Yell ( std::string_view  text,
Language  language,
WorldObject const *  = nullptr 
)
overridevirtual

Handles yelled message in regular chat based on declared language and in config pre-defined Range.

Reimplemented from Unit.

9434{
9435 std::string _text(text);
9436
9437 if (!sScriptMgr->OnPlayerCanUseChat(this, CHAT_MSG_YELL, language, _text))
9438 {
9439 return;
9440 }
9441
9442 sScriptMgr->OnPlayerChat(this, CHAT_MSG_YELL, language, _text);
9443
9444 WorldPacket data;
9445 ChatHandler::BuildChatPacket(data, CHAT_MSG_YELL, language, this, this, _text);
9446
9447 SendDirectMessage(&data);
9448
9449 // Special handling for messages, do not use visibility map for stealthed units
9450 Acore::MessageDistDeliverer notifier(this, &data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), false, nullptr, true);
9451 Cell::VisitObjects(this, notifier, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL));
9452}
@ CHAT_MSG_YELL
Definition SharedDefines.h:3408
@ CONFIG_LISTEN_RANGE_YELL
Definition WorldConfig.h:152

References ChatHandler::BuildChatPacket(), CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, SendDirectMessage(), sScriptMgr, sWorld, and Cell::VisitObjects().

Referenced by WorldSession::HandleMessagechatOpcode().

◆ Yell() [2/2]

void Player::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
overridevirtual

Reimplemented from Unit.

9455{
9456 Talk(textId, CHAT_MSG_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
9457}

References CHAT_MSG_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Friends And Related Symbol Documentation

◆ CinematicMgr

friend class CinematicMgr
friend

Referenced by Player().

◆ Item::AddToUpdateQueueOf

void Item::AddToUpdateQueueOf ( Player player)
friend

◆ Item::RemoveFromUpdateQueueOf

void Item::RemoveFromUpdateQueueOf ( Player player)
friend

◆ WorldSession

friend class WorldSession
friend

Member Data Documentation

◆ _activeCheats

uint32 Player::_activeCheats
private

◆ _BgBattlegroundQueueID

◆ _cinematicMgr

CinematicMgr* Player::_cinematicMgr
private

◆ _corpseLocation

◆ _expectingChangeTransport

bool Player::_expectingChangeTransport
private

◆ _farSightDistance

Optional<float> Player::_farSightDistance = { }
private

◆ _innTriggerId

uint32 Player::_innTriggerId
protected

◆ _instanceResetTimes

◆ _mapChangeOrderCounter

uint32 Player::_mapChangeOrderCounter
private

◆ _pendingBindId

uint32 Player::_pendingBindId
private

◆ _pendingBindTimer

uint32 Player::_pendingBindTimer
private

Referenced by SetPendingBind(), and Update().

◆ _pendingFlightChangeCounter

uint32 Player::_pendingFlightChangeCounter
private

◆ _restBonus

float Player::_restBonus
protected

◆ _restFlagMask

uint32 Player::_restFlagMask
protected

◆ _restTime

time_t Player::_restTime
protected

◆ _wasOutdoor

bool Player::_wasOutdoor
private

◆ autoReplyMsg

std::string Player::autoReplyMsg

◆ bgZoneIdToFillWorldStates

std::unordered_map< int, bgZoneRef > Player::bgZoneIdToFillWorldStates = {}
static
16255{
16256 SPELLMOD_FLAT = 107, // SPELL_AURA_ADD_FLAT_MODIFIER
16257 SPELLMOD_PCT = 108 // SPELL_AURA_ADD_PCT_MODIFIER
16258};
16259
16260// 2^n values, Player::m_isunderwater is a bitmask. These are Trinity internal values, they are never send to any client
16262{
16263 UNDERWATER_NONE = 0x00,
16264 UNDERWATER_INWATER = 0x01, // terrain type is water and player is afflicted by it
16265 UNDERWATER_INLAVA = 0x02, // terrain type is lava and player is afflicted by it
16266 UNDERWATER_INSLIME = 0x04, // terrain type is lava and player is afflicted by it
16267 UNDERWATER_INDARKWATER = 0x08, // terrain type is dark water and player is afflicted by it
16268
16270};
16271
16273{
16277 ERR_BANKSLOT_OK = 3
16278};
16279
16281{
16284 PLAYERSPELL_NEW = 2,
16287};
16288
16289struct PlayerSpell
16290{
16291 PlayerSpellState State : 7; // UPPER CASE TO CAUSE CONSOLE ERRORS (CHECK EVERY USAGE)!
16292 bool Active : 1; // UPPER CASE TO CAUSE CONSOLE ERRORS (CHECK EVERY USAGE)! lower rank of a spell are not useable, but learnt
16293 uint8 specMask : 8;
16294 bool IsInSpec(uint8 spec) { return (specMask & (1 << spec)); }
16295};
16296
16297struct PlayerTalent
16298{
16299 PlayerSpellState State : 8; // UPPER CASE TO CAUSE CONSOLE ERRORS (CHECK EVERY USAGE)!
16300 uint8 specMask : 8;
16301 uint32 talentID;
16302 bool inSpellBook;
16303 bool IsInSpec(uint8 spec) { return (specMask & (1 << spec)); }
16304};
16305
16306enum TalentTree // talent tabs
16307{
16338};
16339
16340#define SPEC_MASK_ALL 255
16341
16342// Spell modifier (used for modify other spells)
16343struct SpellModifier
16344{
16345 SpellModifier(Aura* _ownerAura = nullptr) : op(SPELLMOD_DAMAGE), type(SPELLMOD_FLAT), charges(0), mask(), ownerAura(_ownerAura) {}
16346 SpellModOp op : 8;
16347 SpellModType type : 8;
16348 int16 charges : 16;
16349 int32 value{0};
16350 flag96 mask;
16351 uint32 spellId{0};
16352 Aura* const ownerAura;
16353 uint32 priority{0};
16354};
16355
16356typedef std::unordered_map<uint32, PlayerTalent*> PlayerTalentMap;
16357typedef std::unordered_map<uint32, PlayerSpell*> PlayerSpellMap;
16358typedef std::list<SpellModifier*> SpellModList;
16359
16361
16362struct SpellCooldown
16363{
16364 uint32 end;
16365 uint16 category;
16366 uint32 itemid;
16367 uint32 maxduration;
16368 bool sendToSpectator: 1;
16369 bool needSendToClient: 1;
16370};
16371
16372typedef std::map<uint32, SpellCooldown> SpellCooldowns;
16373typedef std::unordered_map<uint32 /*instanceId*/, time_t/*releaseTime*/> InstanceTimeMap;
16374
16376{
16380 TRAINER_SPELL_GREEN_DISABLED = 10 // custom value, not send to client: formally green but learn not allowed
16381};
16382
16384{
16387 ACTIONBUTTON_NEW = 2,
16389};
16390
16392{
16393 ACTION_BUTTON_SPELL = 0x00,
16394 ACTION_BUTTON_C = 0x01, // click?
16395 ACTION_BUTTON_EQSET = 0x20,
16396 ACTION_BUTTON_MACRO = 0x40,
16398 ACTION_BUTTON_ITEM = 0x80
16399};
16400
16401enum QuestSound
16402{
16404};
16405
16406#define ACTION_BUTTON_ACTION(X) (uint32(X) & 0x00FFFFFF)
16407#define ACTION_BUTTON_TYPE(X) ((uint32(X) & 0xFF000000) >> 24)
16408#define MAX_ACTION_BUTTON_ACTION_VALUE (0x00FFFFFF+1)
16409
16410struct ActionButton
16411{
16412 ActionButton() = default;
16413
16414 uint32 packedData{0};
16416
16417 // helpers
16418 [[nodiscard]] ActionButtonType GetType() const { return ActionButtonType(ACTION_BUTTON_TYPE(packedData)); }
16419 [[nodiscard]] uint32 GetAction() const { return ACTION_BUTTON_ACTION(packedData); }
16420 void SetActionAndType(uint32 action, ActionButtonType type)
16421 {
16422 uint32 newData = action | (uint32(type) << 24);
16423 if (newData != packedData || uState == ACTIONBUTTON_DELETED)
16424 {
16425 packedData = newData;
16426 if (uState != ACTIONBUTTON_NEW)
16427 uState = ACTIONBUTTON_CHANGED;
16428 }
16429 }
16430};
16431
16432#define MAX_ACTION_BUTTONS 144 //checked in 3.2.0
16433
16434typedef std::map<uint8, ActionButton> ActionButtonList;
16435
16437{
16438 PlayerCreateInfoItem(uint32 id, uint32 amount) : item_id(id), item_amount(amount) {}
16439
16440 uint32 item_id;
16441 uint32 item_amount;
16442};
16443
16444typedef std::list<PlayerCreateInfoItem> PlayerCreateInfoItems;
16445
16447{
16448 PlayerClassLevelInfo() = default;
16449 uint32 basehealth{0};
16450 uint32 basemana{0};
16451};
16452
16453struct PlayerClassInfo
16454{
16455 PlayerClassInfo() = default;
16456
16457 PlayerClassLevelInfo* levelInfo{nullptr}; //[level-1] 0..MaxPlayerLevel-1
16458};
16459
16460struct PlayerLevelInfo
16461{
16463 {
16464 stats.fill(0);
16465 }
16466
16467 std::array<uint32, MAX_STATS> stats = { };
16468};
16469
16470typedef std::list<uint32> PlayerCreateInfoSpells;
16471
16473{
16474 PlayerCreateInfoAction() = default;
16475 PlayerCreateInfoAction(uint8 _button, uint32 _action, uint8 _type) : button(_button), type(_type), action(_action) {}
16476
16477 uint8 button{0};
16478 uint8 type{0};
16479 uint32 action{0};
16480};
16481
16482typedef std::list<PlayerCreateInfoAction> PlayerCreateInfoActions;
16483
16485{
16486 uint16 SkillId;
16487 uint16 Rank;
16488};
16489
16490typedef std::list<PlayerCreateInfoSkill> PlayerCreateInfoSkills;
16491
16492struct PlayerInfo
16493{
16494 // existence checked by displayId != 0
16495 PlayerInfo() = default;
16496
16497 uint32 mapId{0};
16498 uint32 areaId{0};
16499 float positionX{0.0f};
16500 float positionY{0.0f};
16501 float positionZ{0.0f};
16502 float orientation{0.0f};
16503 uint16 displayId_m{0};
16504 uint16 displayId_f{0};
16506 PlayerCreateInfoSpells customSpells;
16507 PlayerCreateInfoSpells castSpells;
16510
16511 PlayerLevelInfo* levelInfo{nullptr}; //[level-1] 0..MaxPlayerLevel-1
16512};
16513
16514struct PvPInfo
16515{
16516 PvPInfo() = default;
16517
16518 bool IsHostile{false};
16519 bool IsInHostileArea{false};
16520 bool IsInNoPvPArea{false};
16521 bool IsInFFAPvPArea{false};
16522 time_t EndTimer{0};
16523 time_t FFAPvPEndTimer{0};
16524};
16525
16526enum DuelState
16527{
16532};
16533
16534struct DuelInfo
16535{
16536 DuelInfo(Player* opponent, Player* initiator, bool isMounted) : Opponent(opponent), Initiator(initiator), IsMounted(isMounted) {}
16537
16538 Player* const Opponent;
16539 Player* const Initiator;
16540 bool const IsMounted;
16542 time_t StartTime = 0;
16543 time_t OutOfBoundsTime = 0;
16544};
16545
16546struct Areas
16547{
16548 uint32 areaID;
16549 uint32 areaFlag;
16550 float x1;
16551 float x2;
16552 float y1;
16553 float y2;
16554};
16555
16556#define MAX_RUNES 6
16557
16558enum RuneCooldowns
16559{
16560 RUNE_BASE_COOLDOWN = 10000,
16561 RUNE_GRACE_PERIOD = 2500, // xinef: maximum possible grace period
16562 RUNE_MISS_COOLDOWN = 1500, // cooldown applied on runes when the spell misses
16563};
16564
16565enum RuneType
16566{
16567 RUNE_BLOOD = 0,
16568 RUNE_UNHOLY = 1,
16569 RUNE_FROST = 2,
16570 RUNE_DEATH = 3,
16571 NUM_RUNE_TYPES = 4
16572};
16573
16574struct RuneInfo
16575{
16576 uint8 BaseRune;
16577 uint8 CurrentRune;
16578 uint32 Cooldown;
16579 uint32 GracePeriod;
16580 AuraEffect const* ConvertAura;
16581};
16582
16583struct Runes
16584{
16585 RuneInfo runes[MAX_RUNES];
16586 uint8 runeState; // mask of available runes
16587 RuneType lastUsedRune;
16588
16589 void SetRuneState(uint8 index, bool set = true)
16590 {
16591 if (set)
16592 runeState |= (1 << index); // usable
16593 else
16594 runeState &= ~(1 << index); // on cooldown
16595 }
16596};
16597
16598struct EnchantDuration
16599{
16600 EnchantDuration() = default;
16601 EnchantDuration(Item* _item, EnchantmentSlot _slot, uint32 _leftduration) : item(_item), slot(_slot),
16602 leftduration(_leftduration) { ASSERT(item); };
16603
16604 Item* item{nullptr};
16606 uint32 leftduration{0};
16607};
16608
16609typedef std::list<EnchantDuration> EnchantDurationList;
16610typedef std::list<Item*> ItemDurationList;
16611
16613{
16614 MOVE_WATER_WALK = 3,
16615 MOVE_LAND_WALK = 4
16616};
16617
16618enum DrunkenState
16619{
16620 DRUNKEN_SOBER = 0,
16621 DRUNKEN_TIPSY = 1,
16622 DRUNKEN_DRUNK = 2,
16623 DRUNKEN_SMASHED = 3
16624};
16625
16626#define MAX_DRUNKEN 4
16627
16628enum PlayerFlags : uint32
16629{
16630 PLAYER_FLAGS_GROUP_LEADER = 0x00000001,
16631 PLAYER_FLAGS_AFK = 0x00000002,
16632 PLAYER_FLAGS_DND = 0x00000004,
16633 PLAYER_FLAGS_GM = 0x00000008,
16634 PLAYER_FLAGS_GHOST = 0x00000010,
16635 PLAYER_FLAGS_RESTING = 0x00000020,
16636 PLAYER_FLAGS_UNK6 = 0x00000040,
16637 PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
16638 PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
16639 PLAYER_FLAGS_IN_PVP = 0x00000200,
16640 PLAYER_FLAGS_HIDE_HELM = 0x00000400,
16641 PLAYER_FLAGS_HIDE_CLOAK = 0x00000800,
16642 PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time
16643 PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time
16644 PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000,
16645 PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something?
16646 PLAYER_FLAGS_UNK16 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
16647 PLAYER_FLAGS_TAXI_BENCHMARK = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
16648 PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
16649 PLAYER_FLAGS_UBER = 0x00080000,
16650 PLAYER_FLAGS_UNK20 = 0x00100000,
16651 PLAYER_FLAGS_UNK21 = 0x00200000,
16652 PLAYER_FLAGS_COMMENTATOR2 = 0x00400000,
16653 PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_USES_RANGED_SLOT, SPELL_EFFECT_ATTACK, checked only for active player
16654 PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack
16655 PLAYER_FLAGS_NO_XP_GAIN = 0x02000000,
16656 PLAYER_FLAGS_UNK26 = 0x04000000,
16657 PLAYER_FLAGS_UNK27 = 0x08000000,
16658 PLAYER_FLAGS_UNK28 = 0x10000000,
16659 PLAYER_FLAGS_UNK29 = 0x20000000,
16660 PLAYER_FLAGS_UNK30 = 0x40000000,
16661 PLAYER_FLAGS_UNK31 = 0x80000000,
16662};
16663
16665
16666enum PlayerBytesOffsets //@todo: Implement
16667{
16672};
16673
16674enum PlayerBytes2Offsets //@todo: Implement
16675{
16680};
16681
16682enum PlayerBytes3Offsets //@todo: Implement
16683{
16688};
16689
16690enum PlayerFieldBytesOffsets //@todo: Implement
16691{
16696};
16697
16699{
16703};
16704
16705static_assert((PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID & 1) == 0, "PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID must be aligned to 2 byte boundary");
16706
16707#define PLAYER_BYTES_2_OVERRIDE_SPELLS_UINT16_OFFSET (PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID / 2)
16708
16709#define KNOWN_TITLES_SIZE 3
16710#define MAX_TITLE_INDEX (KNOWN_TITLES_SIZE*64) // 3 uint64 fields
16711
16712// used in PLAYER_FIELD_BYTES values
16714{
16716 PLAYER_FIELD_BYTE_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit
16717 PLAYER_FIELD_BYTE_NO_RELEASE_WINDOW = 0x00000010 // Display no "release spirit" window at all
16718};
16719
16720// used in PLAYER_FIELD_BYTES2 values
16722{
16726};
16727
16728enum MirrorTimerType
16729{
16730 FATIGUE_TIMER = 0,
16731 BREATH_TIMER = 1,
16732 FIRE_TIMER = 2
16733};
16734#define MAX_TIMERS 3
16735#define DISABLED_MIRROR_TIMER -1
16736
16737// 2^n values
16739{
16740 // gm abilities
16741 PLAYER_EXTRA_GM_ON = 0x0001,
16743 PLAYER_EXTRA_TAXICHEAT = 0x0008,
16745 PLAYER_EXTRA_GM_CHAT = 0x0020, // Show GM badge in chat messages
16746 PLAYER_EXTRA_HAS_310_FLYER = 0x0040, // Marks if player already has 310% speed flying mount
16747 PLAYER_EXTRA_SPECTATOR_ON = 0x0080, // Marks if player is spectactor
16748 PLAYER_EXTRA_PVP_DEATH = 0x0100, // store PvP death status until corpse creating.
16749 PLAYER_EXTRA_SHOW_DK_PET = 0x0400, // Marks if player should see ghoul on login screen
16751};
16752
16753// 2^n values
16754enum AtLoginFlags
16755{
16756 AT_LOGIN_NONE = 0x00,
16757 AT_LOGIN_RENAME = 0x01,
16758 AT_LOGIN_RESET_SPELLS = 0x02,
16760 AT_LOGIN_CUSTOMIZE = 0x08,
16762 AT_LOGIN_FIRST = 0x20,
16764 AT_LOGIN_CHANGE_RACE = 0x80,
16765 AT_LOGIN_RESET_AP = 0x100,
16766 AT_LOGIN_RESET_ARENA = 0x200,
16767 AT_LOGIN_CHECK_ACHIEVS = 0x400,
16768 AT_LOGIN_RESURRECT = 0x800
16769};
16770
16771typedef std::map<uint32, QuestStatusData> QuestStatusMap;
16772typedef std::unordered_set<uint32> RewardedQuestSet;
16773
16774// quest, keep
16775typedef std::map<uint32, bool> QuestStatusSaveMap;
16776
16778{
16779 QUEST_ID_OFFSET = 0,
16783};
16784
16785#define MAX_QUEST_OFFSET 5
16786
16788{
16789 QUEST_STATE_NONE = 0x0000,
16790 QUEST_STATE_COMPLETE = 0x0001,
16791 QUEST_STATE_FAIL = 0x0002
16792};
16793
16795{
16796 SKILL_UNCHANGED = 0,
16797 SKILL_CHANGED = 1,
16798 SKILL_NEW = 2,
16799 SKILL_DELETED = 3
16800};
16801
16802struct SkillStatusData
16803{
16804 SkillStatusData(uint8 _pos, SkillUpdateState _uState) : pos(_pos), uState(_uState)
16805 {
16806 }
16807 uint8 pos;
16808 SkillUpdateState uState;
16809};
16810
16811typedef std::unordered_map<uint32, SkillStatusData> SkillStatusMap;
16812
16813class Quest;
16814class Spell;
16815class Item;
16816class WorldSession;
16817
16818enum PlayerSlots
16819{
16820 // first slot for item stored (in any way in player m_items data)
16822 // last+1 slot for item stored (in any way in player m_items data)
16823 PLAYER_SLOT_END = 150,
16825};
16826
16827#define INVENTORY_SLOT_BAG_0 255
16828
16829enum EquipmentSlots // 19 slots
16830{
16852};
16853
16854enum InventorySlots // 4 slots
16855{
16858};
16859
16860enum InventoryPackSlots // 16 slots
16861{
16864};
16865
16866enum BankItemSlots // 28 slots
16867{
16870};
16871
16872enum BankBagSlots // 7 slots
16873{
16876};
16877
16878enum BuyBackSlots // 12 slots
16879{
16880 // stored in m_items, there is no more m_buybackitems
16881 BUYBACK_SLOT_START = 74,
16882 BUYBACK_SLOT_END = 86
16883};
16884
16885enum KeyRingSlots // 32 slots
16886{
16887 KEYRING_SLOT_START = 86,
16888 KEYRING_SLOT_END = 118
16889};
16890
16891enum CurrencyTokenSlots // 32 slots
16892{
16895};
16896
16898{
16903};
16904
16905struct EquipmentSet
16906{
16907 EquipmentSet() = default;
16908
16909 uint64 Guid;
16910 std::string Name;
16911 std::string IconName;
16912 uint32 IgnoreMask{0};
16915};
16916
16917#define MAX_EQUIPMENT_SET_INDEX 10 // client limit
16918
16919typedef std::map<uint32, EquipmentSet> EquipmentSets;
16920
16921struct ItemPosCount
16922{
16923 ItemPosCount(uint16 _pos, uint32 _count) : pos(_pos), count(_count) {}
16924 [[nodiscard]] bool isContainedIn(std::vector<ItemPosCount> const& vec) const;
16925 uint16 pos;
16926 uint32 count;
16927};
16928typedef std::vector<ItemPosCount> ItemPosCountVec;
16929
16930struct SavedItem
16931{
16932 Item* item;
16933 uint16 dstpos;
16934
16935 SavedItem(Item* _item, uint16 dstpos) : item(_item), dstpos(dstpos) {}
16936};
16937
16939{
16940 TRANSFER_ABORT_NONE = 0x00,
16941 TRANSFER_ABORT_ERROR = 0x01,
16942 TRANSFER_ABORT_MAX_PLAYERS = 0x02, // Transfer Aborted: instance is full
16943 TRANSFER_ABORT_NOT_FOUND = 0x03, // Transfer Aborted: instance not found
16944 TRANSFER_ABORT_TOO_MANY_INSTANCES = 0x04, // You have entered too many instances recently.
16945 TRANSFER_ABORT_ZONE_IN_COMBAT = 0x06, // Unable to zone in while an encounter is in progress.
16946 TRANSFER_ABORT_INSUF_EXPAN_LVL = 0x07, // You must have <TBC, WotLK> expansion installed to access this area.
16947 TRANSFER_ABORT_DIFFICULTY = 0x08, // <Normal, Heroic, Epic> difficulty mode is not available for %s.
16948 TRANSFER_ABORT_UNIQUE_MESSAGE = 0x09, // Until you've escaped TLK's grasp, you cannot leave this place!
16949 TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES = 0x0A, // Additional instances cannot be launched, please try again later.
16950 TRANSFER_ABORT_NEED_GROUP = 0x0B, // 3.1
16951 TRANSFER_ABORT_NOT_FOUND1 = 0x0C, // 3.1
16952 TRANSFER_ABORT_NOT_FOUND2 = 0x0D, // 3.1
16953 TRANSFER_ABORT_NOT_FOUND3 = 0x0E, // 3.2
16954 TRANSFER_ABORT_REALM_ONLY = 0x0F, // All players on party must be from the same realm.
16955 TRANSFER_ABORT_MAP_NOT_ALLOWED = 0x10, // Map can't be entered at this time.
16956};
16957
16959{
16960 RAID_INSTANCE_WARNING_HOURS = 1, // WARNING! %s is scheduled to reset in %d hour(s).
16961 RAID_INSTANCE_WARNING_MIN = 2, // WARNING! %s is scheduled to reset in %d minute(s)!
16962 RAID_INSTANCE_WARNING_MIN_SOON = 3, // WARNING! %s is scheduled to reset in %d minute(s). Please exit the zone or you will be returned to your bind location!
16963 RAID_INSTANCE_WELCOME = 4, // Welcome to %s. This raid instance is scheduled to reset in %s.
16965};
16966
16967class InstanceSave;
16968
16969enum RestFlag
16970{
16971 REST_FLAG_IN_TAVERN = 0x1,
16972 REST_FLAG_IN_CITY = 0x2,
16973 REST_FLAG_IN_FACTION_AREA = 0x4, // used with AREA_FLAG_REST_ZONE_*
16974};
16975
16977{
16978 TELE_TO_GM_MODE = 0x01,
16982 TELE_TO_SPELL = 0x10,
16984 TELE_TO_WITH_PET = 0x40,
16986};
16987
16990{
16991 DAMAGE_EXHAUSTED = 0,
16992 DAMAGE_DROWNING = 1,
16993 DAMAGE_FALL = 2,
16994 DAMAGE_LAVA = 3,
16995 DAMAGE_SLIME = 4,
16996 DAMAGE_FIRE = 5,
16997 DAMAGE_FALL_TO_VOID = 6 // custom case for fall without durability loss
16998};
16999
17000enum PlayerChatTag
17001{
17002 CHAT_TAG_NONE = 0x00,
17003 CHAT_TAG_AFK = 0x01,
17004 CHAT_TAG_DND = 0x02,
17005 CHAT_TAG_GM = 0x04,
17006 CHAT_TAG_COM = 0x08, // Commentator tag. Do not exist in clean client
17007 CHAT_TAG_DEV = 0x10,
17008};
17009
17010enum PlayedTimeIndex
17011{
17014};
17015
17016#define MAX_PLAYED_TIME_INDEX 2
17017
17018// used at player loading query list preparing, and later result selection
17020{
17056};
17057
17059{
17060 DELAYED_SAVE_PLAYER = 0x01,
17068};
17069
17071{
17083};
17084
17085// Player summoning auto-decline time (in secs)
17086#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
17087#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
17088
17090{
17091 uint32 id;
17092 TeamId faction;
17093 std::string note;
17094 uint32 priority;
17095 bool checkLeaderOnly;
17096};
17097
17099{
17100 uint8 levelMin;
17101 uint8 levelMax;
17102 uint16 reqItemLevel;
17103 std::vector<ProgressionRequirement*> quests;
17104 std::vector<ProgressionRequirement*> items;
17105 std::vector<ProgressionRequirement*> achievements;
17106};
17107
17109{
17110 CHAR_DELETE_REMOVE = 0, // Completely remove from the database
17111 CHAR_DELETE_UNLINK = 1 // The character gets unlinked from the account,
17112 // the name gets freed up and appears as deleted ingame
17113};
17114
17115enum CurrencyItems
17116{
17117 ITEM_HONOR_POINTS_ID = 43308,
17118 ITEM_ARENA_POINTS_ID = 43307
17119};
17120
17122{
17137};
17138
17139enum PlayerRestState
17140{
17141 REST_STATE_RESTED = 0x01,
17144};
17145
17147{
17151};
17152
17154{
17155 CHEAT_NONE = 0x00,
17156 CHEAT_GOD = 0x01,
17157 CHEAT_CASTTIME = 0x02,
17158 CHEAT_COOLDOWN = 0x04,
17159 CHEAT_POWER = 0x08,
17160 CHEAT_WATERWALK = 0x10
17161};
17162
17163// Used for OnGiveXP PlayerScript hook
17164enum PlayerXPSource
17165{
17166 XPSOURCE_KILL = 0,
17167 XPSOURCE_QUEST = 1,
17169 XPSOURCE_EXPLORE = 3,
17171};
17172
17174{
17176};
17177
17179{
17181};
17182
17183std::ostringstream& operator<< (std::ostringstream& ss, PlayerTaxi const& taxi);
17184
17185class Player;
17186
17187// holder for Battleground data (pussywizard: not stored in db)
17188struct BGData
17189{
17190 BGData() = default;
17191
17192 uint32 bgInstanceID{0};
17194 TeamId bgTeamId{TEAM_NEUTRAL};
17196 bool isInvited{false};
17197 bool bgIsRandom{false};
17198
17199 GuidSet bgAfkReporter;
17200 uint8 bgAfkReportedCount{0};
17201 time_t bgAfkReportedTimer{0};
17202};
17203
17204// holder for Entry Point data (pussywizard: stored in db)
17205struct EntryPointData
17206{
17208 {
17209 ClearTaxiPath();
17210 }
17211
17212 uint32 mountSpell{0};
17213 std::array<uint32, 2> taxiPath;
17214 WorldLocation joinPos;
17215
17216 void ClearTaxiPath() { taxiPath.fill(0); }
17217 [[nodiscard]] bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; }
17218};
17219
17221{
17222 uint32 spellId;
17223 uint32 category;
17224 WorldPacket requestPacket;
17225 bool isItem = false;
17226 bool cancelInProgress = false;
17227
17228 PendingSpellCastRequest(uint32 spellId, uint32 category, WorldPacket&& packet, bool item = false, bool cancel = false)
17229 : spellId(spellId), category(category), requestPacket(std::move(packet)), isItem(item) , cancelInProgress(cancel) {}
17230};
17231
17232class Player : public Unit, public GridObject<Player>
17233{
17234 friend class WorldSession;
17235 friend class CinematicMgr;
17236 friend void Item::AddToUpdateQueueOf(Player* player);
17237 friend void Item::RemoveFromUpdateQueueOf(Player* player);
17238public:
17239 explicit Player(WorldSession* session);
17240 ~Player() override;
17241
17242 void CleanupsBeforeDelete(bool finalCleanup = true) override;
17243
17244 void AddToWorld() override;
17245 void RemoveFromWorld() override;
17246
17247 void SetObjectScale(float scale) override
17248 {
17249 Unit::SetObjectScale(scale);
17252 }
17253
17254 bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0, Unit* target = nullptr, bool newInstance = false);
17255 bool TeleportTo(WorldLocation const& loc, uint32 options = 0, Unit* target = nullptr)
17256 {
17257 return TeleportTo(loc.GetMapId(), loc.GetPositionX(), loc.GetPositionY(), loc.GetPositionZ(), loc.GetOrientation(), options, target);
17258 }
17259 bool TeleportToEntryPoint();
17260
17261 void SetSummonPoint(uint32 mapid, float x, float y, float z, uint32 delay = 0, bool asSpectator = false);
17262 [[nodiscard]] bool IsSummonAsSpectator() const;
17263 void SetSummonAsSpectator(bool on) { m_summon_asSpectator = on; }
17264 void SummonIfPossible(bool agree, ObjectGuid summoner_guid);
17265 [[nodiscard]] time_t GetSummonExpireTimer() const { return m_summon_expire; }
17266
17267 bool Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo);
17268
17269 void Update(uint32 time) override;
17270
17272 bool HasPlayerFlag(PlayerFlags flags) const { return HasFlag(PLAYER_FLAGS, flags) != 0; }
17273 void SetPlayerFlag(PlayerFlags flags) { SetFlag(PLAYER_FLAGS, flags); }
17274 void RemovePlayerFlag(PlayerFlags flags) { RemoveFlag(PLAYER_FLAGS, flags); }
17276
17277 static bool BuildEnumData(PreparedQueryResult result, WorldPacket* data);
17278
17279 [[nodiscard]] bool IsClass(Classes playerClass, ClassContext context = CLASS_CONTEXT_NONE) const override;
17280
17281 void SetInWater(bool apply);
17282
17283 [[nodiscard]] bool IsInWater() const override { return m_isInWater; }
17284 [[nodiscard]] bool IsFalling() const;
17285 bool IsInAreaTriggerRadius(AreaTrigger const* trigger, float delta = 0.f) const;
17286
17289 void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0);
17290 void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap);
17291
17292 bool CanInteractWithQuestGiver(Object* questGiver);
17293 Creature* GetNPCIfCanInteractWith(ObjectGuid const& guid, uint32 npcflagmask);
17294 [[nodiscard]] GameObject* GetGameObjectIfCanInteractWith(ObjectGuid const& guid, GameobjectTypes type) const;
17295
17296 void ToggleAFK();
17297 void ToggleDND();
17298 [[nodiscard]] bool isAFK() const { return HasPlayerFlag(PLAYER_FLAGS_AFK); }
17299 [[nodiscard]] bool isDND() const { return HasPlayerFlag(PLAYER_FLAGS_DND); }
17300 [[nodiscard]] uint8 GetChatTag() const;
17301 std::string autoReplyMsg;
17302
17303 uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const* newSkin = nullptr);
17304
17305 PlayerSocial* GetSocial() { return m_social; }
17306
17309 bool ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc = nullptr, uint32 spellid = 1);
17310 bool ActivateTaxiPathTo(uint32 taxi_path_id, uint32 spellid = 1);
17312 void ContinueTaxiFlight();
17314 // mount_id can be used in scripting calls
17315
17316 [[nodiscard]] bool IsCommentator() const { return HasPlayerFlag(PLAYER_FLAGS_COMMENTATOR2); }
17318 [[nodiscard]] bool IsDeveloper() const { return HasPlayerFlag(PLAYER_FLAGS_DEVELOPER); }
17321 [[nodiscard]] bool isAcceptWhispers() const { return m_ExtraFlags & PLAYER_EXTRA_ACCEPT_WHISPERS; }
17322 void SetAcceptWhispers(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_ACCEPT_WHISPERS; else m_ExtraFlags &= ~PLAYER_EXTRA_ACCEPT_WHISPERS; }
17323 [[nodiscard]] bool IsGameMaster() const { return m_ExtraFlags & PLAYER_EXTRA_GM_ON; }
17324 void SetGameMaster(bool on);
17325 [[nodiscard]] bool isGMChat() const { return m_ExtraFlags & PLAYER_EXTRA_GM_CHAT; }
17326 void SetGMChat(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_CHAT; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_CHAT; }
17327 [[nodiscard]] bool IsGMSpectator() const { return m_ExtraFlags & PLAYER_EXTRA_GM_SPECTATOR; }
17328 void SetGMSpectator(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_GM_SPECTATOR; else m_ExtraFlags &= ~PLAYER_EXTRA_GM_SPECTATOR; }
17329
17330 [[nodiscard]] bool isTaxiCheater() const { return m_ExtraFlags & PLAYER_EXTRA_TAXICHEAT; }
17331 void SetTaxiCheater(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_TAXICHEAT; else m_ExtraFlags &= ~PLAYER_EXTRA_TAXICHEAT; }
17332 [[nodiscard]] bool isGMVisible() const { return !(m_ExtraFlags & PLAYER_EXTRA_GM_INVISIBLE); }
17333 void SetGMVisible(bool on);
17334 bool Has310Flyer(bool checkAllSpells, uint32 excludeSpellId = 0);
17335 void SetHas310Flyer(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_HAS_310_FLYER; else m_ExtraFlags &= ~PLAYER_EXTRA_HAS_310_FLYER; }
17336 void SetPvPDeath(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_PVP_DEATH; else m_ExtraFlags &= ~PLAYER_EXTRA_PVP_DEATH; }
17337
17338 void GiveXP(uint32 xp, Unit* victim, float group_rate = 1.0f, bool isLFGReward = false);
17339 void GiveLevel(uint8 level);
17340
17341 void InitStatsForLevel(bool reapplyMods = false);
17342
17343 [[nodiscard]] bool HasActivePowerType(Powers power) override;
17344
17345 // .cheat command related
17346 [[nodiscard]] bool GetCommandStatus(uint32 command) const { return _activeCheats & command; }
17347 void SetCommandStatusOn(uint32 command) { _activeCheats |= command; }
17348 void SetCommandStatusOff(uint32 command) { _activeCheats &= ~command; }
17349
17350 // Played Time Stuff
17351 time_t m_logintime;
17352 time_t m_Last_tick;
17356
17357 void setDeathState(DeathState s, bool despawn = false) override; // overwrite Unit::setDeathState
17358
17359 void SetRestState(uint32 triggerId);
17360 void RemoveRestState();
17362 [[nodiscard]] float GetRestBonus() const { return _restBonus; }
17363 void SetRestBonus(float restBonusNew);
17364
17365 [[nodiscard]] bool HasRestFlag(RestFlag restFlag) const { return (_restFlagMask & restFlag) != 0; }
17366 void SetRestFlag(RestFlag restFlag, uint32 triggerId = 0);
17367 void RemoveRestFlag(RestFlag restFlag);
17368 [[nodiscard]] uint32 GetInnTriggerId() const { return _innTriggerId; }
17369
17370 PetStable* GetPetStable() { return m_petStable.get(); }
17372 [[nodiscard]] PetStable const* GetPetStable() const { return m_petStable.get(); }
17373
17374 [[nodiscard]] Pet* GetPet() const;
17375 Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration = 0ms, uint32 healthPct = 0);
17376 void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false);
17377 bool CanPetResurrect();
17378 bool IsExistPet();
17379 Pet* CreatePet(Creature* creatureTarget, uint32 spellID = 0);
17380 Pet* CreatePet(uint32 creatureEntry, uint32 spellID = 0);
17381
17382 [[nodiscard]] uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
17383
17385 void Say(std::string_view text, Language language, WorldObject const* = nullptr) override;
17386 void Say(uint32 textId, WorldObject const* target = nullptr) override;
17388 void Yell(std::string_view text, Language language, WorldObject const* = nullptr) override;
17389 void Yell(uint32 textId, WorldObject const* target = nullptr) override;
17391 void TextEmote(std::string_view text, WorldObject const* = nullptr, bool = false) override;
17392 void TextEmote(uint32 textId, WorldObject const* target = nullptr, bool isBossEmote = false) override;
17394 void Whisper(std::string_view text, Language language, Player* receiver, bool = false) override;
17395 void Whisper(uint32 textId, Player* target, bool isBossWhisper = false) override;
17396
17397 /*********************************************************/
17398 /*** STORAGE SYSTEM ***/
17399 /*********************************************************/
17400
17401 void SetVirtualItemSlot(uint8 i, Item* item);
17402 void SetSheath(SheathState sheathed) override; // overwrite Unit version
17403 uint8 FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool swap) const;
17404 uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = nullptr) const;
17405 uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = nullptr) const;
17406 [[nodiscard]] Item* GetItemByGuid(ObjectGuid guid) const;
17407 [[nodiscard]] Item* GetItemByEntry(uint32 entry) const;
17408 [[nodiscard]] Item* GetItemByPos(uint16 pos) const;
17409 [[nodiscard]] Item* GetItemByPos(uint8 bag, uint8 slot) const;
17410 [[nodiscard]] Bag* GetBagByPos(uint8 slot) const;
17411 [[nodiscard]] uint32 GetFreeInventorySpace() const;
17412 [[nodiscard]] inline Item* GetUseableItemByPos(uint8 bag, uint8 slot) const //Does additional check for disarmed weapons
17413 {
17415 return nullptr;
17416 return GetItemByPos(bag, slot);
17417 }
17418 [[nodiscard]] Item* GetWeaponForAttack(WeaponAttackType attackType, bool useable = false) const;
17419 bool HasWeapon(WeaponAttackType type) const override { return GetWeaponForAttack(type, false); }
17420 bool HasWeaponForAttack(WeaponAttackType type) const override { return (Unit::HasWeaponForAttack(type) && GetWeaponForAttack(type, true)); }
17421 [[nodiscard]] Item* GetShield(bool useable = false) const;
17422 static WeaponAttackType GetAttackBySlot(uint8 slot); // MAX_ATTACK if not weapon slot
17423 std::vector<Item*>& GetItemUpdateQueue() { return m_itemUpdateQueue; }
17424 static bool IsInventoryPos(uint16 pos) { return IsInventoryPos(pos >> 8, pos & 255); }
17425 static bool IsInventoryPos(uint8 bag, uint8 slot);
17426 static bool IsEquipmentPos(uint16 pos) { return IsEquipmentPos(pos >> 8, pos & 255); }
17427 static bool IsEquipmentPos(uint8 bag, uint8 slot);
17428 static bool IsBagPos(uint16 pos);
17429 static bool IsBankPos(uint16 pos) { return IsBankPos(pos >> 8, pos & 255); }
17430 static bool IsBankPos(uint8 bag, uint8 slot);
17431 bool IsValidPos(uint16 pos, bool explicit_pos) { return IsValidPos(pos >> 8, pos & 255, explicit_pos); }
17432 bool IsValidPos(uint8 bag, uint8 slot, bool explicit_pos);
17433 [[nodiscard]] uint8 GetBankBagSlotCount() const { return GetByteValue(PLAYER_BYTES_2, 2); }
17434 void SetBankBagSlotCount(uint8 count) { SetByteValue(PLAYER_BYTES_2, 2, count); }
17435 [[nodiscard]] bool HasItemCount(uint32 item, uint32 count = 1, bool inBankAlso = false) const;
17436 bool HasItemFitToSpellRequirements(SpellInfo const* spellInfo, Item const* ignoreItem = nullptr) const;
17437 bool CanNoReagentCast(SpellInfo const* spellInfo) const;
17438 [[nodiscard]] bool HasItemOrGemWithIdEquipped(uint32 item, uint32 count, uint8 except_slot = NULL_SLOT) const;
17439 [[nodiscard]] bool HasItemOrGemWithLimitCategoryEquipped(uint32 limitCategory, uint32 count, uint8 except_slot = NULL_SLOT) const;
17440 InventoryResult CanTakeMoreSimilarItems(Item* pItem) const { return CanTakeMoreSimilarItems(pItem->GetEntry(), pItem->GetCount(), pItem); }
17441 [[nodiscard]] InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count) const { return CanTakeMoreSimilarItems(entry, count, nullptr); }
17442 InventoryResult CanStoreNewItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 item, uint32 count, uint32* no_space_count = nullptr) const
17443 {
17444 return CanStoreItem(bag, slot, dest, item, count, nullptr, false, no_space_count);
17445 }
17446 InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap = false) const
17447 {
17448 if (!pItem)
17450 uint32 count = pItem->GetCount();
17451 return CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, nullptr);
17452 }
17453 InventoryResult CanStoreItems(Item** pItem, int32 count) const;
17454 InventoryResult CanEquipNewItem(uint8 slot, uint16& dest, uint32 item, bool swap) const;
17455 InventoryResult CanEquipItem(uint8 slot, uint16& dest, Item* pItem, bool swap, bool not_loading = true) const;
17456
17457 InventoryResult CanEquipUniqueItem(Item* pItem, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const;
17458 InventoryResult CanEquipUniqueItem(ItemTemplate const* itemProto, uint8 except_slot = NULL_SLOT, uint32 limit_count = 1) const;
17459 [[nodiscard]] InventoryResult CanUnequipItems(uint32 item, uint32 count) const;
17460 [[nodiscard]] InventoryResult CanUnequipItem(uint16 src, bool swap) const;
17461 InventoryResult CanBankItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap, bool not_loading = true) const;
17462 InventoryResult CanUseItem(Item* pItem, bool not_loading = true) const;
17463 [[nodiscard]] bool HasItemTotemCategory(uint32 TotemCategory) const;
17464 bool IsTotemCategoryCompatiableWith(ItemTemplate const* pProto, uint32 requiredTotemCategoryId) const;
17465 InventoryResult CanUseItem(ItemTemplate const* pItem) const;
17466 [[nodiscard]] InventoryResult CanUseAmmo(uint32 item) const;
17467 InventoryResult CanRollForItemInLFG(ItemTemplate const* item, WorldObject const* lootedObject) const;
17468 Item* StoreNewItem(ItemPosCountVec const& pos, uint32 item, bool update, int32 randomPropertyId = 0);
17469 Item* StoreNewItem(ItemPosCountVec const& pos, uint32 item, bool update, int32 randomPropertyId, AllowedLooterSet& allowedLooters);
17470 Item* StoreItem(ItemPosCountVec const& pos, Item* pItem, bool update);
17471 Item* EquipNewItem(uint16 pos, uint32 item, bool update);
17472 Item* EquipItem(uint16 pos, Item* pItem, bool update);
17473 void AutoUnequipOffhandIfNeed(bool force = false);
17474 bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count);
17475 void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, bool broadcast = false);
17476 void AutoStoreLoot(uint32 loot_id, LootStore const& store, bool broadcast = false) { AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, broadcast); }
17477 LootItem* StoreLootItem(uint8 lootSlot, Loot* loot, InventoryResult& msg);
17478 void UpdateLootAchievements(LootItem* item, Loot* loot);
17479 void UpdateTitansGrip();
17480
17481 InventoryResult CanTakeMoreSimilarItems(uint32 entry, uint32 count, Item* pItem, uint32* no_space_count = nullptr) const;
17482 InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, uint32 entry, uint32 count, Item* pItem = nullptr, bool swap = false, uint32* no_space_count = nullptr) const;
17483
17484 void AddRefundReference(ObjectGuid itemGUID);
17485 void DeleteRefundReference(ObjectGuid itemGUID);
17486
17487 void ApplyEquipCooldown(Item* pItem);
17488 void SetAmmo(uint32 item);
17489 void RemoveAmmo();
17490 [[nodiscard]] float GetAmmoDPS() const { return m_ammoDPS; }
17491 bool CheckAmmoCompatibility(ItemTemplate const* ammo_proto) const;
17492 void QuickEquipItem(uint16 pos, Item* pItem);
17493 void VisualizeItem(uint8 slot, Item* pItem);
17494 void SetVisibleItemSlot(uint8 slot, Item* pItem);
17495 Item* BankItem(ItemPosCountVec const& dest, Item* pItem, bool update)
17496 {
17497 return StoreItem(dest, pItem, update);
17498 }
17499 void RemoveItem(uint8 bag, uint8 slot, bool update, bool swap = false);
17500 void MoveItemFromInventory(uint8 bag, uint8 slot, bool update);
17501 // in trade, auction, guild bank, mail....
17502 void MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool update, bool in_characterInventoryDB = false);
17503 // in trade, guild bank, mail....
17505 void DestroyItem(uint8 bag, uint8 slot, bool update);
17506 void DestroyItemCount(uint32 item, uint32 count, bool update, bool unequip_check = false);
17507 void DestroyItemCount(Item* item, uint32& count, bool update);
17508 void DestroyConjuredItems(bool update);
17509 void DestroyZoneLimitedItem(bool update, uint32 new_zone);
17510 void SplitItem(uint16 src, uint16 dst, uint32 count);
17511 void SwapItem(uint16 src, uint16 dst);
17512 void AddItemToBuyBackSlot(Item* pItem, uint32 money);
17514 void RemoveItemFromBuyBackSlot(uint32 slot, bool del);
17515 [[nodiscard]] uint32 GetMaxKeyringSize() const { return KEYRING_SLOT_END - KEYRING_SLOT_START; }
17516 void SendEquipError(InventoryResult msg, Item* pItem, Item* pItem2 = nullptr, uint32 itemid = 0);
17517 void SendBuyError(BuyResult msg, Creature* creature, uint32 item, uint32 param);
17518 void SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, uint32 param);
17519 void AddWeaponProficiency(uint32 newflag) { m_WeaponProficiency |= newflag; }
17520 void AddArmorProficiency(uint32 newflag) { m_ArmorProficiency |= newflag; }
17521 [[nodiscard]] uint32 GetWeaponProficiency() const { return m_WeaponProficiency; }
17522 [[nodiscard]] uint32 GetArmorProficiency() const { return m_ArmorProficiency; }
17523
17524 [[nodiscard]] bool IsTwoHandUsed() const
17525 {
17527 return mainItem && mainItem->GetTemplate()->InventoryType == INVTYPE_2HWEAPON && !CanTitanGrip();
17528 }
17529 void SendNewItem(Item* item, uint32 count, bool received, bool created, bool broadcast = false, bool sendChatMessage = true);
17530 bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot);
17531 bool _StoreOrEquipNewItem(uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot, int32 price, ItemTemplate const* pProto, Creature* pVendor, VendorItem const* crItem, bool bStore);
17532
17533 [[nodiscard]] float GetReputationPriceDiscount(Creature const* creature) const;
17534 [[nodiscard]] float GetReputationPriceDiscount(FactionTemplateEntry const* factionTemplate) const;
17535
17536 [[nodiscard]] Player* GetTrader() const { return m_trade ? m_trade->GetTrader() : nullptr; }
17537 [[nodiscard]] TradeData* GetTradeData() const { return m_trade; }
17538 void TradeCancel(bool sendback, TradeStatus status = TRADE_STATUS_TRADE_CANCELED);
17539
17540 CinematicMgr* GetCinematicMgr() const { return _cinematicMgr; }
17541
17542 void UpdateEnchantTime(uint32 time);
17544 void AddTradeableItem(Item* item);
17545 void RemoveTradeableItem(Item* item);
17546 void UpdateItemDuration(uint32 time, bool realtimeonly = false);
17547 void AddEnchantmentDurations(Item* item);
17548 void RemoveEnchantmentDurations(Item* item);
17549 void RemoveEnchantmentDurationsReferences(Item* item); // pussywizard
17551 void AddEnchantmentDuration(Item* item, EnchantmentSlot slot, uint32 duration);
17552 void ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool apply_dur = true, bool ignore_condition = false);
17553 void ApplyEnchantment(Item* item, bool apply);
17554 void UpdateSkillEnchantments(uint16 skill_id, uint16 curr_value, uint16 new_value);
17558 void AddItemDurations(Item* item);
17559 void RemoveItemDurations(Item* item);
17560 void SendItemDurations();
17561 void LoadCorpse(PreparedQueryResult result);
17562 void LoadPet();
17563
17564 bool AddItem(uint32 itemId, uint32 count);
17565
17566 /*********************************************************/
17567 /*** GOSSIP SYSTEM ***/
17568 /*********************************************************/
17569
17570 void PrepareGossipMenu(WorldObject* source, uint32 menuId = 0, bool showQuests = false);
17571 void SendPreparedGossip(WorldObject* source);
17572 void OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 menuId);
17573
17574 uint32 GetGossipTextId(uint32 menuId, WorldObject* source);
17577
17578 void ToggleInstantFlight();
17579
17580 /*********************************************************/
17581 /*** QUEST SYSTEM ***/
17582 /*********************************************************/
17583
17584 int32 GetQuestLevel(Quest const* quest) const { return quest && (quest->GetQuestLevel() > 0) ? quest->GetQuestLevel() : GetLevel(); }
17585
17586 void PrepareQuestMenu(ObjectGuid guid);
17587 void SendPreparedQuest(ObjectGuid guid);
17588 [[nodiscard]] bool IsActiveQuest(uint32 quest_id) const;
17589 Quest const* GetNextQuest(ObjectGuid guid, Quest const* quest);
17590 bool CanSeeStartQuest(Quest const* quest);
17591 bool CanTakeQuest(Quest const* quest, bool msg);
17592 bool CanAddQuest(Quest const* quest, bool msg);
17593 bool CanCompleteQuest(uint32 quest_id, const QuestStatusData* q_savedStatus = nullptr);
17594 bool CanCompleteRepeatableQuest(Quest const* quest);
17595 bool CanRewardQuest(Quest const* quest, bool msg);
17596 bool CanRewardQuest(Quest const* quest, uint32 reward, bool msg);
17597 void AddQuestAndCheckCompletion(Quest const* quest, Object* questGiver);
17598 void AddQuest(Quest const* quest, Object* questGiver);
17599 void AbandonQuest(uint32 quest_id);
17600 void CompleteQuest(uint32 quest_id);
17601 void IncompleteQuest(uint32 quest_id);
17602 void RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce = true, bool isLFGReward = false);
17603 void SetRewardedQuest(uint32 quest_id);
17604 void FailQuest(uint32 quest_id);
17605 bool SatisfyQuestSkill(Quest const* qInfo, bool msg) const;
17606 bool SatisfyQuestLevel(Quest const* qInfo, bool msg) const;
17607 bool SatisfyQuestLog(bool msg);
17608 bool SatisfyQuestPreviousQuest(Quest const* qInfo, bool msg) const;
17609 bool SatisfyQuestClass(Quest const* qInfo, bool msg) const;
17610 bool SatisfyQuestRace(Quest const* qInfo, bool msg) const;
17611 bool SatisfyQuestReputation(Quest const* qInfo, bool msg) const;
17612 bool SatisfyQuestStatus(Quest const* qInfo, bool msg) const;
17613 bool SatisfyQuestConditions(Quest const* qInfo, bool msg);
17614 bool SatisfyQuestTimed(Quest const* qInfo, bool msg) const;
17615 bool SatisfyQuestExclusiveGroup(Quest const* qInfo, bool msg) const;
17616 bool SatisfyQuestNextChain(Quest const* qInfo, bool msg) const;
17617 bool SatisfyQuestPrevChain(Quest const* qInfo, bool msg) const;
17618 bool SatisfyQuestDay(Quest const* qInfo, bool msg) const;
17619 bool SatisfyQuestWeek(Quest const* qInfo, bool msg) const;
17620 bool SatisfyQuestMonth(Quest const* qInfo, bool msg) const;
17621 bool SatisfyQuestSeasonal(Quest const* qInfo, bool msg) const;
17622 bool GiveQuestSourceItem(Quest const* quest);
17623 bool TakeQuestSourceItem(uint32 questId, bool msg);
17624 uint32 CalculateQuestRewardXP(Quest const* quest);
17625 [[nodiscard]] bool GetQuestRewardStatus(uint32 quest_id) const;
17626 [[nodiscard]] QuestStatus GetQuestStatus(uint32 quest_id) const;
17627 void SetQuestStatus(uint32 questId, QuestStatus status, bool update = true);
17628 void RemoveActiveQuest(uint32 questId, bool update = true);
17629 void RemoveRewardedQuest(uint32 questId, bool update = true);
17630 void SendQuestUpdate(uint32 questId);
17632 float GetQuestRate(bool isDFQuest = false);
17633 void SetDailyQuestStatus(uint32 quest_id);
17634 bool IsDailyQuestDone(uint32 quest_id);
17635 void SetWeeklyQuestStatus(uint32 quest_id);
17636 void SetMonthlyQuestStatus(uint32 quest_id);
17637 void SetSeasonalQuestStatus(uint32 quest_id);
17638 void ResetDailyQuestStatus();
17641 void ResetSeasonalQuestStatus(uint16 event_id);
17642
17643 [[nodiscard]] uint16 FindQuestSlot(uint32 quest_id) const;
17646 [[nodiscard]] uint16 GetQuestSlotCounter(uint16 slot, uint8 counter) const { return (uint16)(GetUInt64Value(PLAYER_QUEST_LOG_1_1 + slot * MAX_QUEST_OFFSET + QUEST_COUNTS_OFFSET) >> (counter * 16)); }
17648 void SetQuestSlot(uint16 slot, uint32 quest_id, uint32 timer = 0)
17649 {
17655 }
17656 void SetQuestSlotCounter(uint16 slot, uint8 counter, uint16 count)
17657 {
17659 val &= ~((uint64)0xFFFF << (counter * 16));
17660 val |= ((uint64)count << (counter * 16));
17662 }
17666 void SwapQuestSlot(uint16 slot1, uint16 slot2)
17667 {
17668 for (int i = 0; i < MAX_QUEST_OFFSET; ++i)
17669 {
17672
17675 }
17676 }
17678 void AreaExploredOrEventHappens(uint32 questId);
17679 void GroupEventHappens(uint32 questId, WorldObject const* pEventObject);
17680 void ItemAddedQuestCheck(uint32 entry, uint32 count);
17681 void ItemRemovedQuestCheck(uint32 entry, uint32 count);
17682 void KilledMonster(CreatureTemplate const* cInfo, ObjectGuid guid);
17684 void KilledPlayerCredit(uint16 count = 1);
17685 void KilledPlayerCreditForQuest(uint16 count, Quest const* quest);
17686 void KillCreditGO(uint32 entry, ObjectGuid guid = ObjectGuid::Empty);
17687 void TalkedToCreature(uint32 entry, ObjectGuid guid);
17688 void MoneyChanged(uint32 value);
17689 void ReputationChanged(FactionEntry const* factionEntry);
17690 void ReputationChanged2(FactionEntry const* factionEntry);
17691 [[nodiscard]] bool HasQuestForItem(uint32 itemId, uint32 excludeQuestId = 0, bool turnIn = false, bool* showInLoot = nullptr) const;
17692 [[nodiscard]] bool HasQuestForGO(int32 GOId) const;
17693 [[nodiscard]] bool HasQuest(uint32 questId) const;
17695 [[nodiscard]] bool CanShareQuest(uint32 quest_id) const;
17696
17697 void SendQuestComplete(uint32 quest_id);
17698 void SendQuestReward(Quest const* quest, uint32 XP);
17699 void SendQuestFailed(uint32 questId, InventoryResult reason = EQUIP_ERR_OK);
17700 void SendQuestTimerFailed(uint32 quest_id);
17701 void SendCanTakeQuestResponse(uint32 msg) const;
17702 void SendQuestConfirmAccept(Quest const* quest, Player* pReceiver);
17703 void SendPushToPartyResponse(Player const* player, uint8 msg) const;
17704 void SendQuestUpdateAddItem(Quest const* quest, uint32 item_idx, uint16 count);
17705 void SendQuestUpdateAddCreatureOrGo(Quest const* quest, ObjectGuid guid, uint32 creatureOrGO_idx, uint16 old_count, uint16 add_count);
17706 void SendQuestUpdateAddPlayer(Quest const* quest, uint16 old_count, uint16 add_count);
17707
17708 ObjectGuid GetDivider() { return m_divider; }
17709 void SetDivider(ObjectGuid guid = ObjectGuid::Empty) { m_divider = guid; }
17710
17711 uint32 GetInGameTime() { return m_ingametime; }
17712
17713 void SetInGameTime(uint32 time) { m_ingametime = time; }
17714
17715 void AddTimedQuest(uint32 quest_id) { m_timedquests.insert(quest_id); }
17716 void RemoveTimedQuest(uint32 quest_id) { m_timedquests.erase(quest_id); }
17717
17718 [[nodiscard]] bool HasPvPForcingQuest() const;
17719
17720 /*********************************************************/
17721 /*** LOAD SYSTEM ***/
17722 /*********************************************************/
17723
17724 bool LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& holder);
17725 [[nodiscard]] bool isBeingLoaded() const override;
17726
17728 static uint32 GetZoneIdFromDB(ObjectGuid guid);
17729 static bool LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, float& o, bool& in_flight, ObjectGuid::LowType guid);
17730
17731 static bool IsValidGender(uint8 Gender) { return Gender <= GENDER_FEMALE; }
17732
17733 /*********************************************************/
17734 /*** SAVE SYSTEM ***/
17735 /*********************************************************/
17736
17737 void SaveToDB(bool create, bool logout);
17738 void SaveToDB(CharacterDatabaseTransaction trans, bool create, bool logout);
17739 void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction trans); // fast save function for item/money cheating preventing
17742
17743 static void Customize(CharacterCustomizeInfo const* customizeInfo, CharacterDatabaseTransaction trans);
17744 static void SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid);
17745 static void SavePositionInDB(WorldLocation const& loc, uint16 zoneId, ObjectGuid guid, CharacterDatabaseTransaction trans);
17746
17747 static void DeleteFromDB(ObjectGuid::LowType lowGuid, uint32 accountId, bool updateRealmChars, bool deleteFinally);
17748 static void DeleteOldCharacters();
17749 static void DeleteOldCharacters(uint32 keepDays);
17750
17751 static void DeleteOldRecoveryItems();
17752 static void DeleteOldRecoveryItems(uint32 keepDays);
17753
17754 bool m_mailsUpdated;
17755
17756 void SetBindPoint(ObjectGuid guid);
17758 void ResetPetTalents();
17759 void RegenerateAll();
17760 void Regenerate(Powers power);
17761 void RegenerateHealth();
17762 void setRegenTimerCount(uint32 time) {m_regenTimerCount = time;}
17764
17765 [[nodiscard]] uint32 GetMoney() const { return GetUInt32Value(PLAYER_FIELD_COINAGE); }
17766 bool ModifyMoney(int32 amount, bool sendError = true);
17767 [[nodiscard]] bool HasEnoughMoney(uint32 amount) const { return (GetMoney() >= amount); }
17768 [[nodiscard]] bool HasEnoughMoney(int32 amount) const
17769 {
17770 if (amount > 0)
17771 return (GetMoney() >= (uint32) amount);
17772 return true;
17773 }
17774
17775 void SetMoney(uint32 value)
17776 {
17778 MoneyChanged(value);
17780 }
17781
17782 [[nodiscard]] RewardedQuestSet const& getRewardedQuests() const { return m_RewardedQuests; }
17785
17786 [[nodiscard]] std::size_t GetRewardedQuestCount() const { return m_RewardedQuests.size(); }
17787 [[nodiscard]] bool IsQuestRewarded(uint32 quest_id) const
17788 {
17789 return m_RewardedQuests.find(quest_id) != m_RewardedQuests.end();
17790 }
17791
17792 [[nodiscard]] Unit* GetSelectedUnit() const;
17793 [[nodiscard]] Player* GetSelectedPlayer() const;
17794
17795 void SetTarget(ObjectGuid /*guid*/ = ObjectGuid::Empty) override { }
17796 void SetSelection(ObjectGuid guid);
17797
17798 void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, ObjectGuid::LowType item_guid = 0, uint32 item_count = 0);
17799 void SendNewMail();
17801 void AddNewMailDeliverTime(time_t deliver_time);
17802
17803 void RemoveMail(uint32 id);
17804
17805 void AddMail(Mail* mail) { m_mail.push_front(mail); }// for call from WorldSession::SendMailTo
17806 uint32 GetMailSize() { return m_mail.size();}
17807 Mail* GetMail(uint32 id);
17808
17809 [[nodiscard]] PlayerMails const& GetMails() const { return m_mail; }
17810 void SendItemRetrievalMail(uint32 itemEntry, uint32 count); // Item retrieval mails sent by The Postmaster (34337)
17811 void SendItemRetrievalMail(std::vector<std::pair<uint32, uint32>> mailItems); // Item retrieval mails sent by The Postmaster (34337)
17812
17813 /*********************************************************/
17814 /*** MAILED ITEMS SYSTEM ***/
17815 /*********************************************************/
17816
17819
17820 typedef std::unordered_map<ObjectGuid::LowType, Item*> ItemMap;
17821
17822 ItemMap mMitems; //template defined in objectmgr.cpp
17823
17824 Item* GetMItem(ObjectGuid::LowType itemLowGuid)
17825 {
17826 ItemMap::const_iterator itr = mMitems.find(itemLowGuid);
17827 return itr != mMitems.end() ? itr->second : nullptr;
17828 }
17829
17830 void AddMItem(Item* it)
17831 {
17832 ASSERT(it);
17833 //ASSERT deleted, because items can be added before loading
17834 mMitems[it->GetGUID().GetCounter()] = it;
17835 }
17836
17837 bool RemoveMItem(ObjectGuid::LowType itemLowGuid)
17838 {
17839 return mMitems.erase(itemLowGuid);
17840 }
17841
17842 void PetSpellInitialize();
17843 void CharmSpellInitialize();
17846 void SendRemoveControlBar();
17847 [[nodiscard]] bool HasSpell(uint32 spell) const override;
17848 [[nodiscard]] bool HasActiveSpell(uint32 spell) const; // show in spellbook
17849 TrainerSpellState GetTrainerSpellState(TrainerSpell const* trainer_spell) const;
17850 [[nodiscard]] bool IsSpellFitByClassAndRace(uint32 spell_id) const;
17851 bool IsNeedCastPassiveSpellAtLearn(SpellInfo const* spellInfo) const;
17852
17853 void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask);
17854 void SendInitialSpells();
17855 void SendLearnPacket(uint32 spellId, bool learn);
17856 bool addSpell(uint32 spellId, uint8 addSpecMask, bool updateActive, bool temporary = false, bool learnFromSkill = false);
17857 bool _addSpell(uint32 spellId, uint8 addSpecMask, bool temporary, bool learnFromSkill = false);
17858 void learnSpell(uint32 spellId, bool temporary = false, bool learnFromSkill = false);
17859 void removeSpell(uint32 spellId, uint8 removeSpecMask, bool onlyTemporary);
17860 void resetSpells();
17861 void LearnCustomSpells();
17862 void LearnDefaultSkills();
17863 void LearnDefaultSkill(uint32 skillId, uint16 rank);
17865 void learnQuestRewardedSpells(Quest const* quest);
17866 void learnSpellHighRank(uint32 spellid);
17867 bool CheckSkillLearnedBySpell(uint32 spellId);
17868 void SetReputation(uint32 factionentry, float value);
17869 [[nodiscard]] uint32 GetReputation(uint32 factionentry) const;
17870 std::string const& GetGuildName();
17871 [[nodiscard]] uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); }
17872 void SetFreeTalentPoints(uint32 points);
17873 bool resetTalents(bool noResetCost = false);
17874 [[nodiscard]] uint32 resetTalentsCost() const;
17875 bool IsMaxLevel() const;
17876 void InitTalentForLevel();
17879 void SendTalentsInfoData(bool pet);
17880 void LearnTalent(uint32 talentId, uint32 talentRank, bool command = false);
17881 void LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRank);
17882
17883 bool addTalent(uint32 spellId, uint8 addSpecMask, uint8 oldTalentRank);
17884 void _removeTalent(PlayerTalentMap::iterator& itr, uint8 specMask);
17885 void _removeTalent(uint32 spellId, uint8 specMask);
17886 void _removeTalentAurasAndSpells(uint32 spellId);
17887 void _addTalentAurasAndSpells(uint32 spellId);
17888 [[nodiscard]] bool HasTalent(uint32 spell_id, uint8 spec) const;
17889
17890 [[nodiscard]] uint32 CalculateTalentsPoints() const;
17891 void SetBonusTalentCount(uint32 count) { m_extraBonusTalentCount = count; };
17893 void AddBonusTalent(uint32 count) { m_extraBonusTalentCount += count; };
17894 void RemoveBonusTalent(uint32 count) { m_extraBonusTalentCount -= count; };
17895
17896 // Dual Spec
17897 void UpdateSpecCount(uint8 count);
17898 [[nodiscard]] uint8 GetActiveSpec() const { return m_activeSpec; }
17899 [[nodiscard]] uint8 GetActiveSpecMask() const { return (1 << m_activeSpec); }
17900 void SetActiveSpec(uint8 spec) { m_activeSpec = spec; }
17901 [[nodiscard]] uint8 GetSpecsCount() const { return m_specsCount; }
17902 void SetSpecsCount(uint8 count) { m_specsCount = count; }
17903 void ActivateSpec(uint8 spec);
17904 void LoadActions(PreparedQueryResult result);
17905 void GetTalentTreePoints(uint8 (&specPoints)[3]) const;
17906 [[nodiscard]] uint8 GetMostPointsTalentTree() const;
17907 bool HasTankSpec();
17908 bool HasMeleeSpec();
17909 bool HasCasterSpec();
17910 bool HasHealSpec();
17911 uint32 GetSpec(int8 spec = -1);
17912
17913 void InitGlyphsForLevel();
17914 void SetGlyphSlot(uint8 slot, uint32 slottype) { SetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot, slottype); }
17915 [[nodiscard]] uint32 GetGlyphSlot(uint8 slot) const { return GetUInt32Value(PLAYER_FIELD_GLYPH_SLOTS_1 + slot); }
17916 void SetGlyph(uint8 slot, uint32 glyph, bool save)
17917 {
17918 m_Glyphs[m_activeSpec][slot] = glyph;
17920
17921 if (save)
17922 SetNeedToSaveGlyphs(true);
17923 }
17924 [[nodiscard]] uint32 GetGlyph(uint8 slot) const { return m_Glyphs[m_activeSpec][slot]; }
17925
17929
17930 [[nodiscard]] PlayerSpellMap const& GetSpellMap() const { return m_spells; }
17931 PlayerSpellMap& GetSpellMap() { return m_spells; }
17932
17933 [[nodiscard]] SpellCooldowns const& GetSpellCooldownMap() const { return m_spellCooldowns; }
17935
17936 SkillStatusMap const& GetSkillStatusMap() const { return mSkillStatus; }
17938
17939 void AddSpellMod(SpellModifier* mod, bool apply);
17940 bool IsAffectedBySpellmod(SpellInfo const* spellInfo, SpellModifier* mod, Spell* spell = nullptr);
17941 bool HasSpellMod(SpellModifier* mod, Spell* spell);
17942 template <class T>
17943 void ApplySpellMod(uint32 spellId, SpellModOp op, T& basevalue, Spell* spell = nullptr, bool temporaryPet = false);
17944 void RemoveSpellMods(Spell* spell);
17945 void RestoreSpellMods(Spell* spell, uint32 ownerAuraId = 0, Aura* aura = nullptr);
17946 void RestoreAllSpellMods(uint32 ownerAuraId = 0, Aura* aura = nullptr);
17947 void DropModCharge(SpellModifier* mod, Spell* spell);
17948 void SetSpellModTakingSpell(Spell* spell, bool apply);
17949
17950 [[nodiscard]] bool HasSpellCooldown(uint32 spell_id) const override;
17951 [[nodiscard]] bool HasSpellItemCooldown(uint32 spell_id, uint32 itemid) const override;
17952 [[nodiscard]] uint32 GetSpellCooldownDelay(uint32 spell_id) const;
17953 void AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 itemId, Spell* spell = nullptr, bool infinityCooldown = false);
17954 void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient = false, bool forceSendToSpectator = false) override;
17955 void _AddSpellCooldown(uint32 spell_id, uint16 categoryId, uint32 itemid, uint32 end_time, bool needSendToClient = false, bool forceSendToSpectator = false);
17956 void ModifySpellCooldown(uint32 spellId, int32 cooldown);
17957 void SendCooldownEvent(SpellInfo const* spellInfo, uint32 itemId = 0, Spell* spell = nullptr, bool setCooldown = true);
17958 void ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) override;
17959 void RemoveSpellCooldown(uint32 spell_id, bool update = false);
17960 void SendClearCooldown(uint32 spell_id, Unit* target);
17961
17963
17965 void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns = false);
17968 void _SaveSpellCooldowns(CharacterDatabaseTransaction trans, bool logout);
17970 void SetLastPotionId(uint32 item_id) { m_lastPotionId = item_id; }
17971 void UpdatePotionCooldown(Spell* spell = nullptr);
17972
17973 void setResurrectRequestData(ObjectGuid guid, uint32 mapId, float X, float Y, float Z, uint32 health, uint32 mana)
17974 {
17975 m_resurrectGUID = guid;
17976 m_resurrectMap = mapId;
17977 m_resurrectX = X;
17978 m_resurrectY = Y;
17979 m_resurrectZ = Z;
17980 m_resurrectHealth = health;
17981 m_resurrectMana = mana;
17982 }
17983 void clearResurrectRequestData() { setResurrectRequestData(ObjectGuid::Empty, 0, 0.0f, 0.0f, 0.0f, 0, 0); }
17984 [[nodiscard]] bool isResurrectRequestedBy(ObjectGuid guid) const { return m_resurrectGUID && m_resurrectGUID == guid; }
17985 [[nodiscard]] bool isResurrectRequested() const { return m_resurrectGUID; }
17987
17988 [[nodiscard]] uint8 getCinematic() const
17989 {
17990 return m_cinematic;
17991 }
17992 void setCinematic(uint8 cine)
17993 {
17994 m_cinematic = cine;
17995 }
17996
17997 ActionButton* addActionButton(uint8 button, uint32 action, uint8 type);
17998 void removeActionButton(uint8 button);
17999 ActionButton const* GetActionButton(uint8 button);
18000 void SendInitialActionButtons() const { SendActionButtons(1); }
18001 void SendActionButtons(uint32 state) const;
18002 bool IsActionButtonDataValid(uint8 button, uint32 action, uint8 type);
18003
18005 void UpdatePvPState();
18006 void UpdateFFAPvPState(bool reset = true);
18007 void SetPvP(bool state)
18008 {
18009 Unit::SetPvP(state);
18010 if (!m_Controlled.empty())
18011 for (auto& itr : m_Controlled)
18012 itr->SetPvP(state);
18013 }
18014 void UpdatePvP(bool state, bool _override = false);
18015 void UpdateZone(uint32 newZone, uint32 newArea, bool force = false);
18016 void UpdateArea(uint32 newArea);
18017 void SetNeedZoneUpdate(bool needUpdate) { m_needZoneUpdate = needUpdate; }
18018
18019 void UpdateZoneDependentAuras(uint32 zone_id); // zones
18020 void UpdateAreaDependentAuras(uint32 area_id); // subzones
18021
18022 void UpdateAfkReport(time_t currTime);
18023 void UpdatePvPFlag(time_t currTime);
18024 void UpdateFFAPvPFlag(time_t currTime);
18025 void UpdateContestedPvP(uint32 currTime);
18026 void SetContestedPvPTimer(uint32 newTime) {m_contestedPvPTimer = newTime;}
18027 void ResetContestedPvP()
18028 {
18032 }
18033
18035 std::unique_ptr<DuelInfo> duel;
18036 void UpdateDuelFlag(time_t currTime);
18037 void CheckDuelDistance(time_t currTime);
18038 void DuelComplete(DuelCompleteType type);
18039 void SendDuelCountdown(uint32 counter);
18040
18041 bool IsGroupVisibleFor(Player const* p) const;
18042 bool IsInSameGroupWith(Player const* p) const;
18043 bool IsInSameRaidWith(Player const* p) const { return p == this || (GetGroup() != nullptr && GetGroup() == p->GetGroup()); }
18044 void UninviteFromGroup();
18045 static void RemoveFromGroup(Group* group, ObjectGuid guid, RemoveMethod method = GROUP_REMOVEMETHOD_DEFAULT, ObjectGuid kicker = ObjectGuid::Empty, const char* reason = nullptr);
18048
18049 void SetInGuild(uint32 GuildId)
18050 {
18052 // xinef: update global storage
18053 sCharacterCache->UpdateCharacterGuildId(GetGUID(), GetGuildId());
18054 }
18055 void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); }
18056 [[nodiscard]] uint8 GetRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); }
18057 void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
18058 [[nodiscard]] uint32 GetGuildId() const { return GetUInt32Value(PLAYER_GUILDID); }
18059 [[nodiscard]] Guild* GetGuild() const;
18061 static void RemovePetitionsAndSigns(ObjectGuid guid, uint32 type);
18062
18063 // Arena Team
18064 void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type)
18065 {
18066 SetArenaTeamInfoField(slot, ARENA_TEAM_ID, ArenaTeamId);
18068 }
18069 void SetArenaTeamInfoField(uint8 slot, ArenaTeamInfoType type, uint32 value);
18070 [[nodiscard]] uint32 GetArenaPersonalRating(uint8 slot) const;
18071 static uint32 GetArenaTeamIdFromDB(ObjectGuid guid, uint8 slot);
18072 static void LeaveAllArenaTeams(ObjectGuid guid);
18073 [[nodiscard]] uint32 GetArenaTeamId(uint8 slot) const;
18074 void SetArenaTeamIdInvited(uint32 ArenaTeamId) { m_ArenaTeamIdInvited = ArenaTeamId; }
18076
18077 [[nodiscard]] Difficulty GetDifficulty(bool isRaid) const { return isRaid ? m_raidDifficulty : m_dungeonDifficulty; }
18078 [[nodiscard]] Difficulty GetDungeonDifficulty() const { return m_dungeonDifficulty; }
18079 [[nodiscard]] Difficulty GetRaidDifficulty() const { return m_raidDifficulty; }
18080 [[nodiscard]] Difficulty GetStoredRaidDifficulty() const { return m_raidMapDifficulty; } // only for use in difficulty packet after exiting to raid map
18081 void SetDungeonDifficulty(Difficulty dungeon_difficulty) { m_dungeonDifficulty = dungeon_difficulty; }
18082 void SetRaidDifficulty(Difficulty raid_difficulty) { m_raidDifficulty = raid_difficulty; }
18084
18085 bool UpdateSkill(uint32 skill_id, uint32 step);
18086 bool UpdateSkillPro(uint16 SkillId, int32 Chance, uint32 step);
18087
18088 bool UpdateCraftSkill(uint32 spellid);
18089 bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1);
18090 bool UpdateFishingSkill();
18091
18092 [[nodiscard]] uint32 GetBaseDefenseSkillValue() const { return GetBaseSkillValue(SKILL_DEFENSE); }
18093 [[nodiscard]] uint32 GetBaseWeaponSkillValue(WeaponAttackType attType) const;
18094
18096
18099
18100 bool UpdateStats(Stats stat) override;
18101 bool UpdateAllStats() override;
18102 void ApplySpellPenetrationBonus(int32 amount, bool apply);
18103 void UpdateResistances(uint32 school) override;
18104 void UpdateArmor() override;
18105 void UpdateMaxHealth() override;
18106 void UpdateMaxPower(Powers power) override;
18107 void ApplyFeralAPBonus(int32 amount, bool apply);
18108 void UpdateAttackPowerAndDamage(bool ranged = false) override;
18110 void ApplySpellPowerBonus(int32 amount, bool apply);
18111 void ApplySpellDamageBonus(int32 amount, bool apply);
18112 void ApplySpellHealingBonus(int32 amount, bool apply);
18114 void ApplyRatingMod(CombatRating cr, int32 value, bool apply);
18115 void UpdateRating(CombatRating cr);
18116 void UpdateAllRatings();
18117
18118 void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float& minDamage, float& maxDamage, uint8 damageIndex) override;
18119
18121 inline void RecalculateRating(CombatRating cr) { ApplyRatingMod(cr, 0, true);}
18123 void GetDodgeFromAgility(float& diminishing, float& nondiminishing);
18124 [[nodiscard]] float GetMissPercentageFromDefence() const;
18126 float OCTRegenHPPerSpirit();
18127 float OCTRegenMPPerSpirit();
18128 [[nodiscard]] float GetRatingMultiplier(CombatRating cr) const;
18129 [[nodiscard]] float GetRatingBonusValue(CombatRating cr) const;
18133 [[nodiscard]] int32 GetSpellPenetrationItemMod() const { return m_spellPenetrationItemMod; }
18134
18135 [[nodiscard]] float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const;
18136 void UpdateBlockPercentage();
18139 void UpdateParryPercentage();
18140 void UpdateDodgePercentage();
18141 void UpdateMeleeHitChances();
18143 void UpdateSpellHitChances();
18144
18146 void UpdateSpellCritChance(uint32 school);
18147 void UpdateArmorPenetration(int32 amount);
18148 void UpdateExpertise(WeaponAttackType attType);
18149 void ApplyManaRegenBonus(int32 amount, bool apply);
18150 void ApplyHealthRegenBonus(int32 amount, bool apply);
18151 void UpdateManaRegen();
18152 void UpdateEnergyRegen();
18153 void UpdateRuneRegen(RuneType rune);
18154
18155 [[nodiscard]] ObjectGuid GetLootGUID() const { return m_lootGuid; }
18156 void SetLootGUID(ObjectGuid guid) { m_lootGuid = guid; }
18157
18158 void RemovedInsignia(Player* looterPlr);
18159
18160 [[nodiscard]] WorldSession* GetSession() const { return m_session; }
18161 void SetSession(WorldSession* sess) { m_session = sess; }
18162
18163 void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) override;
18164 void DestroyForPlayer(Player* target, bool onDeath = false) const override;
18165 void SendLogXPGain(uint32 GivenXP, Unit* victim, uint32 BonusXP, bool recruitAFriend = false, float group_rate = 1.0f);
18166
18167 // notifiers
18173 void SendAutoRepeatCancel(Unit* target);
18174 void SendExplorationExperience(uint32 Area, uint32 Experience);
18175
18176 void SendDungeonDifficulty(bool IsInGroup);
18177 void SendRaidDifficulty(bool IsInGroup, int32 forcedDifficulty = -1);
18178 static void ResetInstances(ObjectGuid guid, uint8 method, bool isRaid);
18179 void SendResetInstanceSuccess(uint32 MapId);
18180 void SendResetInstanceFailed(uint32 reason, uint32 MapId);
18181 void SendResetFailedNotify(uint32 mapid);
18182
18183 bool UpdatePosition(float x, float y, float z, float orientation, bool teleport = false) override;
18184 bool UpdatePosition(const Position& pos, bool teleport = false) { return UpdatePosition(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), teleport); }
18185
18186 void ProcessTerrainStatusUpdate() override;
18187
18188 void SendMessageToSet(WorldPacket const* data, bool self) const override;
18189 void SendMessageToSetInRange(WorldPacket const* data, float dist, bool self) const override;
18190 void SendMessageToSet(WorldPacket const* data, Player const* skipped_rcvr) const override;
18191 void SendTeleportAckPacket();
18192
18193 [[nodiscard]] Corpse* GetCorpse() const;
18194 void SpawnCorpseBones(bool triggerSave = true);
18196 void RemoveCorpse();
18197 void KillPlayer();
18198 static void OfflineResurrect(ObjectGuid const& guid, CharacterDatabaseTransaction trans);
18199 [[nodiscard]] bool HasCorpse() const { return _corpseLocation.GetMapId() != MAPID_INVALID; }
18200 [[nodiscard]] WorldLocation GetCorpseLocation() const { return _corpseLocation; }
18202 void ResurrectPlayer(float restore_percent, bool applySickness = false);
18203 void BuildPlayerRepop();
18204 void RepopAtGraveyard();
18205
18206 void SendDurabilityLoss();
18207 void DurabilityLossAll(double percent, bool inventory);
18208 void DurabilityLoss(Item* item, double percent);
18209 void DurabilityPointsLossAll(int32 points, bool inventory);
18210 void DurabilityPointsLoss(Item* item, int32 points);
18212 uint32 DurabilityRepairAll(bool cost, float discountMod, bool guildBank);
18213 uint32 DurabilityRepair(uint16 pos, bool cost, float discountMod, bool guildBank);
18214
18215 void UpdateMirrorTimers();
18216 void StopMirrorTimers()
18217 {
18221 }
18222 bool IsMirrorTimerActive(MirrorTimerType type) { return m_MirrorTimer[type] == getMaxTimer(type); }
18223
18224 void SetMovement(PlayerMovementType pType);
18225
18226 bool CanJoinConstantChannelInZone(ChatChannelsEntry const* channel, AreaTableEntry const* zone);
18227
18228 void JoinedChannel(Channel* c);
18229 void LeftChannel(Channel* c);
18230 void CleanupChannels();
18231 void ClearChannelWatch();
18232 void UpdateLFGChannel();
18233 void UpdateLocalChannels(uint32 newZone);
18234
18235 void UpdateDefense();
18236 void UpdateWeaponSkill(Unit* victim, WeaponAttackType attType, Item* item = nullptr);
18237 void UpdateCombatSkills(Unit* victim, WeaponAttackType attType, bool defence, Item* item = nullptr);
18238
18239 void SetSkill(uint16 id, uint16 step, uint16 currVal, uint16 maxVal);
18240 [[nodiscard]] uint16 GetMaxSkillValue(uint32 skill) const; // max + perm. bonus + temp bonus
18241 [[nodiscard]] uint16 GetPureMaxSkillValue(uint32 skill) const; // max
18242 [[nodiscard]] uint16 GetSkillValue(uint32 skill) const; // skill value + perm. bonus + temp bonus
18243 [[nodiscard]] uint16 GetBaseSkillValue(uint32 skill) const; // skill value + perm. bonus
18244 [[nodiscard]] uint16 GetPureSkillValue(uint32 skill) const; // skill value
18245 [[nodiscard]] int16 GetSkillPermBonusValue(uint32 skill) const;
18246 [[nodiscard]] int16 GetSkillTempBonusValue(uint32 skill) const;
18247 [[nodiscard]] uint16 GetSkillStep(uint16 skill) const; // 0...6
18248 [[nodiscard]] bool HasSkill(uint32 skill) const;
18249 void learnSkillRewardedSpells(uint32 id, uint32 value);
18250
18252 [[nodiscard]] bool IsBeingTeleported() const { return mSemaphoreTeleport_Near != 0 || mSemaphoreTeleport_Far != 0; }
18253 [[nodiscard]] bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near != 0; }
18254 [[nodiscard]] bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far != 0; }
18255 void SetSemaphoreTeleportNear(time_t tm) { mSemaphoreTeleport_Near = tm; }
18256 void SetSemaphoreTeleportFar(time_t tm) { mSemaphoreTeleport_Far = tm; }
18257 [[nodiscard]] time_t GetSemaphoreTeleportNear() const { return mSemaphoreTeleport_Near; }
18258 [[nodiscard]] time_t GetSemaphoreTeleportFar() const { return mSemaphoreTeleport_Far; }
18260 [[nodiscard]] uint32 GetDelayedOperations() const { return m_DelayedOperations; }
18261 void ScheduleDelayedOperation(uint32 operation)
18262 {
18263 if (operation < DELAYED_END)
18264 m_DelayedOperations |= operation;
18265 }
18266
18268
18269 static TeamId TeamIdForRace(uint8 race);
18270 [[nodiscard]] TeamId GetTeamId(bool original = false) const { return original ? TeamIdForRace(getRace(true)) : m_team; };
18271 void SetFactionForRace(uint8 race);
18272 void setTeamId(TeamId teamid) { m_team = teamid; };
18273
18274 void InitDisplayIds();
18275
18276 bool IsAtGroupRewardDistance(WorldObject const* pRewardSource) const;
18277 bool IsAtLootRewardDistance(WorldObject const* pRewardSource) const;
18278 bool IsAtRecruitAFriendDistance(WorldObject const* pOther) const;
18279 void RewardPlayerAndGroupAtKill(Unit* victim, bool isBattleGround);
18280 void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject* pRewardSource);
18281 bool isHonorOrXPTarget(Unit* victim) const;
18282
18283 bool GetsRecruitAFriendBonus(bool forXP);
18285 void SetGrantableLevels(uint8 val) { m_grantableLevels = val; }
18286
18288 [[nodiscard]] ReputationMgr const& GetReputationMgr() const { return *m_reputationMgr; }
18289 [[nodiscard]] ReputationRank GetReputationRank(uint32 faction_id) const;
18290 void RewardReputation(Unit* victim);
18291 void RewardReputation(Quest const* quest);
18292
18293 float CalculateReputationGain(ReputationSource source, uint32 creatureOrQuestLevel, float rep, int32 faction, bool noQuestBonus = false);
18294
18295 void UpdateSkillsForLevel();
18296 void UpdateSkillsToMaxSkillsForLevel(); // for .levelup
18297 void ModifySkillBonus(uint32 skillid, int32 val, bool talent);
18298
18307 void RewardExtraBonusTalentPoints(uint32 bonusTalentPoints);
18308
18309 /*********************************************************/
18310 /*** PVP SYSTEM ***/
18311 /*********************************************************/
18312 void UpdateHonorFields();
18313 bool RewardHonor(Unit* victim, uint32 groupsize, int32 honor = -1, bool awardXP = true);
18314 [[nodiscard]] uint32 GetHonorPoints() const { return GetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY); }
18315 [[nodiscard]] uint32 GetArenaPoints() const { return GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY); }
18318 [[nodiscard]] uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const;
18319 void SetHonorPoints(uint32 value);
18320 void SetArenaPoints(uint32 value);
18321
18322 // duel health and mana reset methods
18327
18328 //End of PvP System
18329
18330 [[nodiscard]] inline SpellCooldowns GetSpellCooldowns() const { return m_spellCooldowns; }
18331
18332 void SetDrunkValue(uint8 newDrunkValue, uint32 itemId = 0);
18333 [[nodiscard]] uint8 GetDrunkValue() const { return GetByteValue(PLAYER_BYTES_3, 1); }
18334 [[nodiscard]] int32 GetFakeDrunkValue() const { return GetInt32Value(PLAYER_FAKE_INEBRIATION); }
18337
18338 [[nodiscard]] uint32 GetDeathTimer() const { return m_deathTimer; }
18339 [[nodiscard]] uint32 GetCorpseReclaimDelay(bool pvp) const;
18341 int32 CalculateCorpseReclaimDelay(bool load = false);
18342 void SendCorpseReclaimDelay(uint32 delay);
18343
18344 [[nodiscard]] uint32 GetShieldBlockValue() const override; // overwrite Unit version (virtual)
18345 [[nodiscard]] bool CanParry() const { return m_canParry; }
18346 void SetCanParry(bool value);
18347 [[nodiscard]] bool CanBlock() const { return m_canBlock; }
18348 void SetCanBlock(bool value);
18349 [[nodiscard]] bool CanTitanGrip() const { return m_canTitanGrip; }
18350 void SetCanTitanGrip(bool value);
18351 [[nodiscard]] bool CanTameExoticPets() const { return IsGameMaster() || HasAuraType(SPELL_AURA_ALLOW_TAME_PET_TYPE); }
18352
18353 void SetRegularAttackTime();
18354 void SetBaseModValue(BaseModGroup modGroup, BaseModType modType, float value) { m_auraBaseMod[modGroup][modType] = value; }
18355 void HandleBaseModValue(BaseModGroup modGroup, BaseModType modType, float amount, bool apply);
18356 [[nodiscard]] float GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const;
18357 [[nodiscard]] float GetTotalBaseModValue(BaseModGroup modGroup) const;
18358 [[nodiscard]] float GetTotalPercentageModValue(BaseModGroup modGroup) const { return m_auraBaseMod[modGroup][FLAT_MOD] + m_auraBaseMod[modGroup][PCT_MOD]; }
18359 void _ApplyAllStatBonuses();
18360 void _RemoveAllStatBonuses();
18361
18362 void ResetAllPowers();
18363
18364 void CastAllObtainSpells();
18365 void ApplyItemObtainSpells(Item* item, bool apply);
18366 void UpdateItemObtainSpells(Item* item, uint8 bag, uint8 slot);
18367
18368 SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType = BASE_ATTACK, uint8 damageIndex = 0) const override;
18369
18370 void _ApplyWeaponDependentAuraMods(Item* item, WeaponAttackType attackType, bool apply);
18371 void _ApplyWeaponDependentAuraCritMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply);
18372 void _ApplyWeaponDependentAuraDamageMod(Item* item, WeaponAttackType attackType, AuraEffect const* aura, bool apply);
18373
18374 void _ApplyItemMods(Item* item, uint8 slot, bool apply);
18375 void _RemoveAllItemMods();
18376 void _ApplyAllItemMods();
18377 void _ApplyAllLevelScaleItemMods(bool apply);
18378 void _ApplyItemBonuses(ItemTemplate const* proto, uint8 slot, bool apply, bool only_level_scale = false);
18379 void _ApplyWeaponDamage(uint8 slot, ItemTemplate const* proto, ScalingStatValuesEntry const* ssv, bool apply);
18380 void _ApplyAmmoBonuses();
18381 bool EnchantmentFitsRequirements(uint32 enchantmentcondition, int8 slot);
18382 void ToggleMetaGemsActive(uint8 exceptslot, bool apply);
18383 void CorrectMetaGemEnchants(uint8 slot, bool apply);
18384 void InitDataForForm(bool reapplyMods = false);
18385
18386 void ApplyItemEquipSpell(Item* item, bool apply, bool form_change = false);
18387 void ApplyEquipSpell(SpellInfo const* spellInfo, Item* item, bool apply, bool form_change = false);
18389 void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx);
18390 void CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 cast_count, uint32 glyphIndex);
18391 void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto);
18392
18393 void SendEquipmentSetList();
18394 void SetEquipmentSet(uint32 index, EquipmentSet eqset);
18395 void DeleteEquipmentSet(uint64 setGuid);
18396
18397 void SendInitWorldStates(uint32 zoneId, uint32 areaId);
18398 void SendUpdateWorldState(uint32 variable, uint32 value) const;
18399 void SendDirectMessage(WorldPacket const* data) const;
18402
18403 void GetAurasForTarget(Unit* target, bool force = false);
18404
18406 std::vector<ItemSetEffect*> ItemSetEff;
18407
18408 void SendLoot(ObjectGuid guid, LootType loot_type);
18409 void SendLootError(ObjectGuid guid, LootError error);
18410 void SendLootRelease(ObjectGuid guid);
18411 void SendNotifyLootItemRemoved(uint8 lootSlot);
18413
18414 /*********************************************************/
18415 /*** BATTLEGROUND SYSTEM ***/
18416 /*********************************************************/
18417
18418 [[nodiscard]] bool InBattleground() const { return m_bgData.bgInstanceID != 0; }
18419 [[nodiscard]] bool InArena() const;
18420 [[nodiscard]] uint32 GetBattlegroundId() const { return m_bgData.bgInstanceID; }
18421 [[nodiscard]] BattlegroundTypeId GetBattlegroundTypeId() const { return m_bgData.bgTypeID; }
18422 [[nodiscard]] uint32 GetCurrentBattlegroundQueueSlot() const { return m_bgData.bgQueueSlot; }
18423 [[nodiscard]] bool IsInvitedForBattlegroundInstance() const { return m_bgData.isInvited; }
18424 [[nodiscard]] bool IsCurrentBattlegroundRandom() const { return m_bgData.bgIsRandom; }
18425 BGData& GetBGData() { return m_bgData; }
18426 void SetBGData(BGData& bgdata) { m_bgData = bgdata; }
18427 [[nodiscard]] Battleground* GetBattleground(bool create = false) const;
18428
18429 [[nodiscard]] bool InBattlegroundQueue(bool ignoreArena = false) const;
18430 [[nodiscard]] bool IsDeserter() const { return HasAura(26013); }
18431
18433 [[nodiscard]] uint32 GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId) const;
18434 [[nodiscard]] bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const;
18435 [[nodiscard]] bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const;
18436
18437 void SetBattlegroundId(uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId);
18439 bool HasFreeBattlegroundQueueId() const;
18442 bool IsInvitedForBattlegroundInstance(uint32 instanceId) const;
18443
18444 [[nodiscard]] TeamId GetBgTeamId() const { return m_bgData.bgTeamId != TEAM_NEUTRAL ? m_bgData.bgTeamId : GetTeamId(); }
18445
18446 void LeaveBattleground(Battleground* bg = nullptr);
18447 [[nodiscard]] bool CanJoinToBattleground() const;
18449 void ReportedAfkBy(Player* reporter);
18450 void ClearAfkReports() { m_bgData.bgAfkReporter.clear(); }
18451
18452 [[nodiscard]] bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const;
18453 bool CanUseBattlegroundObject(GameObject* gameobject) const;
18454 [[nodiscard]] bool isTotalImmune() const;
18455 [[nodiscard]] bool CanCaptureTowerPoint() const;
18456
18457 bool GetRandomWinner() { return m_IsBGRandomWinner; }
18458 void SetRandomWinner(bool isWinner);
18459
18460 /*********************************************************/
18461 /*** OUTDOOR PVP SYSTEM ***/
18462 /*********************************************************/
18463
18464 [[nodiscard]] OutdoorPvP* GetOutdoorPvP() const;
18465 // returns true if the player is in active state for outdoor pvp objective capturing, false otherwise
18466 bool IsOutdoorPvPActive();
18467
18468 /*********************************************************/
18469 /*** ENVIROMENTAL SYSTEM ***/
18470 /*********************************************************/
18471
18474
18475 /*********************************************************/
18476 /*** FLOOD FILTER SYSTEM ***/
18477 /*********************************************************/
18478
18479 struct ChatFloodThrottle
18480 {
18481 enum Index
18482 {
18483 REGULAR = 0,
18484 ADDON = 1,
18485 MAX
18486 };
18487
18488 time_t Time = 0;
18489 uint32 Count = 0;
18490 };
18491
18493 [[nodiscard]] bool CanSpeak() const;
18494
18495 /*********************************************************/
18496 /*** VARIOUS SYSTEMS ***/
18497 /*********************************************************/
18498 void UpdateFallInformationIfNeed(MovementInfo const& minfo, uint16 opcode);
18501 std::set<Unit*> m_isInSharedVisionOf;
18502 void SetFallInformation(uint32 time, float z)
18503 {
18504 m_lastFallTime = time;
18505 m_lastFallZ = z;
18506 }
18507 void HandleFall(MovementInfo const& movementInfo);
18508
18509 [[nodiscard]] bool canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell);
18510
18511 void SetClientControl(Unit* target, bool allowMove, bool packetOnly = false);
18512
18513 void SetMover(Unit* target);
18514
18515 void SetSeer(WorldObject* target) { m_seer = target; }
18516 WorldObject* GetSeer() const { return m_seer; }
18517 void SetViewpoint(WorldObject* target, bool apply);
18518 [[nodiscard]] WorldObject* GetViewpoint() const;
18519 void StopCastingCharm(Aura* except = nullptr);
18520 void StopCastingBindSight(Aura* except = nullptr);
18521
18522 [[nodiscard]] uint32 GetSaveTimer() const { return m_nextSave; }
18523 void SetSaveTimer(uint32 timer) { m_nextSave = timer; }
18524
18525 // Recall position
18527 float m_recallX;
18528 float m_recallY;
18529 float m_recallZ;
18530 float m_recallO;
18531 void SaveRecallPosition();
18532
18533 void SetHomebind(WorldLocation const& loc, uint32 areaId);
18534
18535 // Homebind coordinates
18538 float m_homebindX;
18539 float m_homebindY;
18540 float m_homebindZ;
18541
18542 [[nodiscard]] WorldLocation GetStartPosition() const;
18543
18544 [[nodiscard]] WorldLocation const& GetEntryPoint() const { return m_entryPointData.joinPos; }
18545 void SetEntryPoint();
18546
18547 // currently visible objects at player client
18548 std::vector<Unit*> m_newVisible; // pussywizard
18549
18550 [[nodiscard]] bool HaveAtClient(WorldObject const* u) const;
18551 [[nodiscard]] bool HaveAtClient(ObjectGuid guid) const;
18552
18553 [[nodiscard]] bool IsNeverVisible() const override;
18554
18555 bool IsVisibleGloballyFor(Player const* player) const;
18556
18557 void GetInitialVisiblePackets(Unit* target);
18558 void UpdateObjectVisibility(bool forced = true, bool fromUpdate = false) override;
18559 void UpdateVisibilityForPlayer(bool mapChange = false);
18560 void UpdateVisibilityOf(WorldObject* target);
18562
18563 template<class T>
18564 void UpdateVisibilityOf(T* target, UpdateData& data, std::vector<Unit*>& visibleNow);
18565
18567
18568 [[nodiscard]] bool HasAtLoginFlag(AtLoginFlags f) const { return m_atLoginFlags & f; }
18570 void RemoveAtLoginFlag(AtLoginFlags flags, bool persist = false);
18571
18572 bool IsUsingLfg();
18573 bool inRandomLfgDungeon();
18574
18575 typedef std::set<uint32> DFQuestsDoneList;
18577
18578 // Temporarily removed pet cache
18583 [[nodiscard]] bool IsPetNeedBeTemporaryUnsummoned() const { return GetSession()->PlayerLogout() || !IsInWorld() || !IsAlive() || IsMounted()/*+in flight*/ || GetVehicle() || IsBeingTeleported(); }
18584 bool CanResummonPet(uint32 spellid);
18585
18586 void SendCinematicStart(uint32 CinematicSequenceId) const;
18587 void SendMovieStart(uint32 MovieId);
18588
18589 uint32 DoRandomRoll(uint32 minimum, uint32 maximum);
18590
18591 [[nodiscard]] uint16 GetMaxSkillValueForLevel() const;
18592 bool IsFFAPvP();
18593 bool IsPvP();
18594
18595 /*********************************************************/
18596 /*** INSTANCE SYSTEM ***/
18597 /*********************************************************/
18598
18599 void UpdateHomebindTime(uint32 time);
18600
18602 bool m_InstanceValid;
18603 void BindToInstance();
18604 void SetPendingBind(uint32 instanceId, uint32 bindTimer) { _pendingBindId = instanceId; _pendingBindTimer = bindTimer; }
18605 [[nodiscard]] bool HasPendingBind() const { return _pendingBindId > 0; }
18606 [[nodiscard]] uint32 GetPendingBind() const { return _pendingBindId; }
18607 void SendRaidInfo();
18608 void SendSavedInstances();
18609 void PrettyPrintRequirementsQuestList(const std::vector<const ProgressionRequirement*>& missingQuests) const;
18610 void PrettyPrintRequirementsAchievementsList(const std::vector<const ProgressionRequirement*>& missingAchievements) const;
18611 void PrettyPrintRequirementsItemsList(const std::vector<const ProgressionRequirement*>& missingItems) const;
18612 bool Satisfy(DungeonProgressionRequirements const* ar, uint32 target_map, bool report = false);
18614 [[nodiscard]] bool CheckInstanceCount(uint32 instanceId) const;
18615
18616 void AddInstanceEnterTime(uint32 instanceId, time_t enterTime)
18617 {
18618 if (_instanceResetTimes.find(instanceId) == _instanceResetTimes.end())
18619 _instanceResetTimes.insert(InstanceTimeMap::value_type(instanceId, enterTime + HOUR));
18620 }
18621
18622 // last used pet number (for BG's)
18623 [[nodiscard]] uint32 GetLastPetNumber() const { return m_lastpetnumber; }
18624 void SetLastPetNumber(uint32 petnumber) { m_lastpetnumber = petnumber; }
18625 [[nodiscard]] uint32 GetLastPetSpell() const { return m_oldpetspell; }
18626 void SetLastPetSpell(uint32 petspell) { m_oldpetspell = petspell; }
18627
18628 /*********************************************************/
18629 /*** GROUP SYSTEM ***/
18630 /*********************************************************/
18631
18632 Group* GetGroupInvite() { return m_groupInvite; }
18633 void SetGroupInvite(Group* group) { m_groupInvite = group; }
18634 Group* GetGroup() { return m_group.getTarget(); }
18635 [[nodiscard]] const Group* GetGroup() const { return (const Group*)m_group.getTarget(); }
18636 GroupReference& GetGroupRef() { return m_group; }
18637 void SetGroup(Group* group, int8 subgroup = -1);
18638 [[nodiscard]] uint8 GetSubGroup() const { return m_group.getSubGroup(); }
18639 [[nodiscard]] uint32 GetGroupUpdateFlag() const { return m_groupUpdateMask; }
18640 void SetGroupUpdateFlag(uint32 flag) { m_groupUpdateMask |= flag; }
18641 [[nodiscard]] uint64 GetAuraUpdateMaskForRaid() const { return m_auraRaidUpdateMask; }
18642 void SetAuraUpdateMaskForRaid(uint8 slot) { m_auraRaidUpdateMask |= (uint64(1) << slot); }
18643 Player* GetNextRandomRaidMember(float radius);
18644 [[nodiscard]] PartyResult CanUninviteFromGroup(ObjectGuid targetPlayerGUID = ObjectGuid::Empty) const;
18645
18646 // Battleground Group System
18647 void SetBattlegroundOrBattlefieldRaid(Group* group, int8 subgroup = -1);
18651 [[nodiscard]] uint8 GetOriginalSubGroup() const { return m_originalGroup.getSubGroup(); }
18652 void SetOriginalGroup(Group* group, int8 subgroup = -1);
18653
18654 void SetPassOnGroupLoot(bool bPassOnGroupLoot) { m_bPassOnGroupLoot = bPassOnGroupLoot; }
18655 [[nodiscard]] bool GetPassOnGroupLoot() const { return m_bPassOnGroupLoot; }
18656
18657 MapReference& GetMapRef() { return m_mapRef; }
18658
18659 // Set map to player and add reference
18660 void SetMap(Map* map) override;
18661 void ResetMap() override;
18662
18663 bool CanTeleport() { return m_canTeleport; }
18664 void SetCanTeleport(bool value) { m_canTeleport = value; }
18665 bool CanKnockback() { return m_canKnockback; }
18666 void SetCanKnockback(bool value) { m_canKnockback = value; }
18667
18668 bool isAllowedToLoot(Creature const* creature);
18669
18670 [[nodiscard]] DeclinedName const* GetDeclinedNames() const { return m_declinedname; }
18671 [[nodiscard]] uint8 GetRunesState() const { return m_runes->runeState; }
18672 [[nodiscard]] RuneType GetBaseRune(uint8 index) const { return RuneType(m_runes->runes[index].BaseRune); }
18673 [[nodiscard]] RuneType GetCurrentRune(uint8 index) const { return RuneType(m_runes->runes[index].CurrentRune); }
18674 [[nodiscard]] uint32 GetRuneCooldown(uint8 index) const { return m_runes->runes[index].Cooldown; }
18675 [[nodiscard]] uint32 GetGracePeriod(uint8 index) const { return m_runes->runes[index].GracePeriod; }
18676 uint32 GetRuneBaseCooldown(uint8 index, bool skipGrace);
18677 [[nodiscard]] bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const;
18679 void SetLastUsedRune(RuneType type) { m_runes->lastUsedRune = type; }
18680 void SetBaseRune(uint8 index, RuneType baseRune) { m_runes->runes[index].BaseRune = baseRune; }
18681 void SetCurrentRune(uint8 index, RuneType currentRune) { m_runes->runes[index].CurrentRune = currentRune; }
18682 void SetRuneCooldown(uint8 index, uint32 cooldown) { m_runes->runes[index].Cooldown = cooldown; m_runes->SetRuneState(index, (cooldown == 0)); }
18683 void SetGracePeriod(uint8 index, uint32 period) { m_runes->runes[index].GracePeriod = period; }
18684 void SetRuneConvertAura(uint8 index, AuraEffect const* aura) { m_runes->runes[index].ConvertAura = aura; }
18685 void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const* aura) { SetRuneConvertAura(index, aura); ConvertRune(index, newType); }
18686 void RemoveRunesByAuraEffect(AuraEffect const* aura);
18687 void RestoreBaseRune(uint8 index);
18688 void ConvertRune(uint8 index, RuneType newType);
18689 void ResyncRunes(uint8 count);
18690 void AddRunePower(uint8 index);
18691 void InitRunes();
18692
18693 void SendRespondInspectAchievements(Player* player) const;
18694 [[nodiscard]] bool HasAchieved(uint32 achievementId) const;
18695 void ResetAchievements();
18697 void ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete = false);
18698 void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = nullptr);
18699 void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
18701 void CompletedAchievement(AchievementEntry const* entry);
18702 [[nodiscard]] AchievementMgr* GetAchievementMgr() const { return m_achievementMgr; }
18703
18704 void SetCreationTime(Seconds creationTime) { m_creationTime = creationTime; }
18705 [[nodiscard]] Seconds GetCreationTime() const { return m_creationTime; }
18706
18707 [[nodiscard]] bool HasTitle(uint32 bitIndex) const;
18708 bool HasTitle(CharTitlesEntry const* title) const { return HasTitle(title->bit_index); }
18709 void SetTitle(CharTitlesEntry const* title, bool lost = false);
18710 void SetCurrentTitle(CharTitlesEntry const* title, bool clear = false) { SetUInt32Value(PLAYER_CHOSEN_TITLE, clear ? 0 : title->bit_index); };
18711
18712 //bool isActiveObject() const { return true; }
18713 bool CanSeeSpellClickOn(Creature const* creature) const;
18714 [[nodiscard]] bool CanSeeVendor(Creature const* creature) const;
18715private:
18716 [[nodiscard]] bool AnyVendorOptionAvailable(uint32 menuId, Creature const* creature) const;
18717public:
18718 [[nodiscard]] uint32 GetChampioningFaction() const { return m_ChampioningFaction; }
18719 void SetChampioningFaction(uint32 faction) { m_ChampioningFaction = faction; }
18721
18722 float GetAverageItemLevel();
18725
18726 void ClearWhisperWhiteList() { WhisperList.clear(); }
18727 void AddWhisperWhiteList(ObjectGuid guid) { WhisperList.push_back(guid); }
18729 void RemoveFromWhisperWhiteList(ObjectGuid guid) { WhisperList.remove(guid); }
18730
18731 [[nodiscard]] bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
18732 [[nodiscard]] bool CanEnterWater() const override { return true; }
18734
18735 // saving
18737 // arena spectator
18738 [[nodiscard]] bool IsSpectator() const { return m_ExtraFlags & PLAYER_EXTRA_SPECTATOR_ON; }
18739 void SetIsSpectator(bool on);
18740 [[nodiscard]] bool NeedSendSpectatorData() const;
18741 void SetPendingSpectatorForBG(uint32 bgInstanceId) { m_pendingSpectatorForBG = bgInstanceId; }
18742 [[nodiscard]] bool HasPendingSpectatorForBG(uint32 bgInstanceId) const { return m_pendingSpectatorForBG == bgInstanceId; }
18752
18753 // Dancing Rune weapon
18754 void setRuneWeaponGUID(ObjectGuid guid) { m_drwGUID = guid; };
18757
18758 [[nodiscard]] bool CanSeeDKPet() const { return m_ExtraFlags & PLAYER_EXTRA_SHOW_DK_PET; }
18759 void SetShowDKPet(bool on) { if (on) m_ExtraFlags |= PLAYER_EXTRA_SHOW_DK_PET; else m_ExtraFlags &= ~PLAYER_EXTRA_SHOW_DK_PET; };
18760 void PrepareCharmAISpells();
18762
18763 bool NeedToSaveGlyphs() { return m_NeedToSaveGlyphs; }
18764 void SetNeedToSaveGlyphs(bool val) { m_NeedToSaveGlyphs = val; }
18765
18767 void SetMountBlockId(uint32 mount) { m_MountBlockId = mount; }
18768
18769 [[nodiscard]] float GetRealParry() const { return m_realParry; }
18770 [[nodiscard]] float GetRealDodge() const { return m_realDodge; }
18771 // mt maps
18772 [[nodiscard]] const PlayerTalentMap& GetTalentMap() const { return m_talents; }
18773 [[nodiscard]] uint32 GetNextSave() const { return m_nextSave; }
18774 [[nodiscard]] SpellModList const& GetSpellModList(uint32 type) const { return m_spellMods[type]; }
18775
18778
18779 static std::unordered_map<int, bgZoneRef> bgZoneIdToFillWorldStates; // zoneId -> FillInitialWorldStates
18780
18781 void SetFarSightDistance(float radius);
18782 void ResetFarSightDistance();
18783 [[nodiscard]] Optional<float> GetFarSightDistance() const;
18784
18785 float GetSightRange(WorldObject const* target = nullptr) const override;
18786 bool IsWorldObjectOutOfSightRange(WorldObject const* target) const;
18787
18788 std::string GetPlayerName();
18789
18790 // Settings
18791 [[nodiscard]] PlayerSetting GetPlayerSetting(std::string const& source, uint32 index);
18792 void UpdatePlayerSetting(std::string const& source, uint32 index, uint32 value);
18793
18794 void SendSystemMessage(std::string_view msg, bool escapeCharacters = false);
18795
18796 std::string GetDebugInfo() const override;
18797
18799 void SetExpectingChangeTransport(bool state) { _expectingChangeTransport = state; }
18800
18802 void SetPendingFlightChange(uint32 counter) { _pendingFlightChangeCounter = counter; }
18803
18806
18807 /*********************************************************/
18808 /*** SPELL QUEUE SYSTEM ***/
18809 /*********************************************************/
18810protected:
18812 void ProcessSpellQueue();
18813
18814public:
18815 std::deque<PendingSpellCastRequest> SpellQueue;
18816 const PendingSpellCastRequest* GetCastRequest(uint32 category) const;
18817 bool CanExecutePendingSpellCastRequest(SpellInfo const* spellInfo);
18818 void ExecuteOrCancelSpellCastRequest(PendingSpellCastRequest* castRequest, bool isCancel = false);
18819 bool CanRequestSpellCast(SpellInfo const* spellInfo);
18820
18821protected:
18822 // Gamemaster whisper whitelist
18824
18825 // Performance Varibales
18826 bool m_NeedToSaveGlyphs;
18827 // Mount block bug
18829 // Real stats
18830 float m_realDodge;
18831 float m_realParry;
18832
18834
18840
18841 /*********************************************************/
18842 /*** BATTLEGROUND SYSTEM ***/
18843 /*********************************************************/
18844
18845 struct BgBattlegroundQueueID_Rec
18846 {
18849 };
18850
18851 std::array<BgBattlegroundQueueID_Rec, PLAYER_MAX_BATTLEGROUND_QUEUES> _BgBattlegroundQueueID;
18853 bool m_IsBGRandomWinner;
18854
18855 /*********************************************************/
18856 /*** ENTRY POINT ***/
18857 /*********************************************************/
18858
18860
18861 /*********************************************************/
18862 /*** QUEST SYSTEM ***/
18863 /*********************************************************/
18864
18865 //We allow only one timed quest active at the same time. Below can then be simple value instead of set.
18866 typedef std::set<uint32> QuestSet;
18867 typedef std::set<uint32> SeasonalQuestSet;
18868 typedef std::unordered_map<uint32, SeasonalQuestSet> SeasonalEventQuestMap;
18873
18876
18877 /*********************************************************/
18878 /*** LOAD SYSTEM ***/
18879 /*********************************************************/
18880
18881 void _LoadActions(PreparedQueryResult result);
18882 void _LoadAuras(PreparedQueryResult result, uint32 timediff);
18883 void _LoadGlyphAuras();
18884 void _LoadInventory(PreparedQueryResult result, uint32 timeDiff);
18885 void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult);
18886 static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint32 mailId, Mail* mail, Field* fields);
18894 void _LoadGroup();
18895 void _LoadSkills(PreparedQueryResult result);
18896 void _LoadSpells(PreparedQueryResult result);
18900 void _LoadArenaTeamInfo();
18903 void _LoadGlyphs(PreparedQueryResult result);
18904 void _LoadTalents(PreparedQueryResult result);
18908 void _LoadPetStable(uint8 petStableSlots, PreparedQueryResult result);
18909
18910 /*********************************************************/
18911 /*** SAVE SYSTEM ***/
18912 /*********************************************************/
18913
18915 void _SaveAuras(CharacterDatabaseTransaction trans, bool logout);
18929 void _SaveCharacter(bool create, CharacterDatabaseTransaction trans);
18932
18933 /*********************************************************/
18934 /*** ENVIRONMENTAL SYSTEM ***/
18935 /*********************************************************/
18936 void HandleSobering();
18937 void SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 CurrentValue, int32 Regen);
18939 void HandleDrowning(uint32 time_diff);
18941
18942 /*********************************************************/
18943 /*** HONOR SYSTEM ***/
18944 /*********************************************************/
18945 time_t m_lastHonorUpdateTime;
18946
18947 void outDebugValues() const;
18949
18950 TeamId m_team;
18951 uint32 m_nextSave; // pussywizard
18952 uint16 m_additionalSaveTimer; // pussywizard
18953 uint8 m_additionalSaveMask; // pussywizard
18954 uint16 m_hostileReferenceCheckTimer; // pussywizard
18955 std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> m_chatFloodData;
18959
18961
18964
18965 std::vector<Item*> m_itemUpdateQueue;
18967
18969
18972
18976
18978
18981
18985 uint32 m_lastPotionId; // last used health/mana potion in combat, that block next potion use
18986
18988
18991
18993
18995
19005
19007 //uint32 m_pad;
19008 // Spell* m_spellModTakingSpell; // Spell for which charges are dropped in spell::finish
19009
19013 std::mutex m_soulboundTradableLock;
19014
19019
19021
19022 typedef std::list<Channel*> JoinedChannelsList;
19024
19026
19028
19033 time_t m_lastDailyQuestTime;
19034
19037
19041
19043 time_t m_deathExpireTime;
19044
19047 bool m_canParry;
19048 bool m_canBlock;
19049 bool m_canTitanGrip;
19051 float m_ammoDPS;
19052
19053 float m_Expertise;
19054 float m_OffhandExpertise;
19055
19057 time_t _restTime;
19059 float _restBonus;
19063 time_t m_resetTalentsTime;
19067
19068 // Social
19070
19071 // Groups
19077 bool m_bPassOnGroupLoot;
19078
19079 // last used pet number (for BG's)
19081
19082 // Player summoning
19083 time_t m_summon_expire;
19085 float m_summon_x;
19086 float m_summon_y;
19087 float m_summon_z;
19089
19091 Runes* m_runes;
19093
19094 bool CanAlwaysSee(WorldObject const* obj) const override;
19095
19096 bool IsAlwaysDetectableFor(WorldObject const* seer) const override;
19097
19099
19100 bool m_needZoneUpdate;
19101
19102private:
19103 // internal common parts for CanStore/StoreItem functions
19104 InventoryResult CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool swap, Item* pSrcItem) const;
19105 InventoryResult CanStoreItem_InBag(uint8 bag, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool merge, bool non_specialized, Item* pSrcItem, uint8 skip_bag, uint8 skip_slot) const;
19106 InventoryResult CanStoreItem_InInventorySlots(uint8 slot_begin, uint8 slot_end, ItemPosCountVec& dest, ItemTemplate const* pProto, uint32& count, bool merge, Item* pSrcItem, uint8 skip_bag, uint8 skip_slot) const;
19107 Item* _StoreItem(uint16 pos, Item* pItem, uint32 count, bool clone, bool update);
19108 Item* _LoadItem(CharacterDatabaseTransaction trans, uint32 zoneId, uint32 timeDiff, Field* fields);
19109
19111
19114 void SendRefundInfo(Item* item);
19115 void RefundItem(Item* item);
19116
19117 // know currencies are not removed at any point (0 displayed)
19118 void AddKnownCurrency(uint32 itemId);
19119
19120 void AdjustQuestReqItemCount(Quest const* quest, QuestStatusData& questStatusData);
19121
19122 [[nodiscard]] bool MustDelayTeleport() const { return m_bMustDelayTeleport; } // pussywizard: must delay teleports during player update to the very end
19123 void SetMustDelayTeleport(bool setting) { m_bMustDelayTeleport = setting; }
19124 [[nodiscard]] bool HasDelayedTeleport() const { return m_bHasDelayedTeleport; }
19125 void SetHasDelayedTeleport(bool setting) { m_bHasDelayedTeleport = setting; }
19126
19128
19129 void UpdateCharmedAI();
19130
19132 float m_lastFallZ;
19133
19137 bool m_isInWater;
19138
19139 // Current teleport data
19144
19148 bool m_canTeleport;
19149 bool m_canKnockback;
19150
19151 std::unique_ptr<PetStable> m_petStable;
19152
19153 // Temporary removed pet cache
19156
19159
19161
19163
19167
19169
19170 // duel health and mana reset attributes
19173
19175
19177
19179
19181
19182 bool _wasOutdoor;
19183
19185
19187
19191};
19192
19193void AddItemsSetItem(Player* player, Item* item);
19194void RemoveItemsSetItem(Player* player, ItemTemplate const* proto);
19195
19196#endif
ArenaTeamInfoType
Definition ArenaTeam.h:73
AchievementCriteriaTimedTypes
Definition DBCEnums.h:109
AchievementCriteriaCondition
Definition DBCEnums.h:86
AchievementCriteriaTypes
Definition DBCEnums.h:121
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:27
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:30
#define DEFINE_ENUM_FLAG(enumType)
Definition EnumFlag.h:26
ItemClass
Definition ItemTemplate.h:290
BuyResult
Definition Item.h:140
SellResult
Definition Item.h:154
LootError
Definition LootMgr.h:95
LootType
Definition LootMgr.h:77
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:254
std::set< ObjectGuid > GuidSet
Definition ObjectGuid.h:253
std::map< std::string, PlayerSettingVector > PlayerSettingMap
Definition PlayerSettings.h:53
PlayerCharmedAISpells
Definition Player.h:909
@ SPELL_HIGH_DAMAGE2
Definition Player.h:915
QuestSound
Definition Player.h:240
std::deque< Mail * > PlayerMails
Definition Player.h:68
std::list< PlayerCreateInfoSkill > PlayerCreateInfoSkills
Definition Player.h:328
TrainerSpellState
Definition Player.h:214
ReferAFriendError
Definition Player.h:960
@ ERR_REFER_A_FRIEND_TARGET_TOO_HIGH
Definition Player.h:963
@ ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S
Definition Player.h:974
@ ERR_REFER_A_FRIEND_DIFFERENT_FACTION
Definition Player.h:966
@ ERR_REFER_A_FRIEND_NONE
Definition Player.h:961
@ ERR_REFER_A_FRIEND_NO_TARGET
Definition Player.h:969
@ ERR_REFER_A_FRIEND_NOT_NOW
Definition Player.h:967
@ ERR_REFER_A_FRIEND_INSUF_EXPAN_LVL
Definition Player.h:973
@ ERR_REFER_A_FRIEND_INSUFFICIENT_GRANTABLE_LEVELS
Definition Player.h:964
@ ERR_REFER_A_FRIEND_NOT_REFERRED_BY
Definition Player.h:962
@ ERR_REFER_A_FRIEND_TOO_FAR
Definition Player.h:965
@ ERR_REFER_A_FRIEND_SUMMON_LEVEL_MAX_I
Definition Player.h:971
@ ERR_REFER_A_FRIEND_NOT_IN_GROUP
Definition Player.h:970
@ ERR_REFER_A_FRIEND_GRANT_LEVEL_MAX_I
Definition Player.h:968
@ ERR_REFER_A_FRIEND_SUMMON_COOLDOWN
Definition Player.h:972
TeleportToOptions
Definition Player.h:815
EnviromentalDamage
Type of environmental damages.
Definition Player.h:828
@ DAMAGE_FIRE
Definition Player.h:834
std::list< SpellModifier * > SpellModList
Definition Player.h:196
@ RUNE_UNHOLY
Definition Player.h:406
@ RUNE_DEATH
Definition Player.h:408
@ RUNE_FROST
Definition Player.h:407
DuelState
Definition Player.h:365
PlayerFieldByte2Flags
Definition Player.h:560
@ PLAYER_FIELD_BYTE2_STEALTH
Definition Player.h:562
@ PLAYER_FIELD_BYTE2_INVISIBILITY_GLOW
Definition Player.h:563
@ PLAYER_FIELD_BYTE2_NONE
Definition Player.h:561
QuestSlotStateMask
Definition Player.h:626
@ QUEST_STATE_NONE
Definition Player.h:627
PlayerFieldByteFlags
Definition Player.h:552
@ PLAYER_FIELD_BYTE_NO_RELEASE_WINDOW
Definition Player.h:555
@ PLAYER_FIELD_BYTE_TRACK_STEALTHED
Definition Player.h:553
TransferAbortReason
Definition Player.h:777
@ TRANSFER_ABORT_TOO_MANY_INSTANCES
Definition Player.h:782
@ TRANSFER_ABORT_NOT_FOUND1
Definition Player.h:789
@ TRANSFER_ABORT_TOO_MANY_REALM_INSTANCES
Definition Player.h:787
@ TRANSFER_ABORT_MAX_PLAYERS
Definition Player.h:780
@ TRANSFER_ABORT_NOT_FOUND3
Definition Player.h:791
@ TRANSFER_ABORT_ZONE_IN_COMBAT
Definition Player.h:783
@ TRANSFER_ABORT_NONE
Definition Player.h:778
@ TRANSFER_ABORT_NOT_FOUND
Definition Player.h:781
@ TRANSFER_ABORT_NEED_GROUP
Definition Player.h:788
@ TRANSFER_ABORT_NOT_FOUND2
Definition Player.h:790
@ TRANSFER_ABORT_REALM_ONLY
Definition Player.h:792
@ TRANSFER_ABORT_ERROR
Definition Player.h:779
PlayerExtraFlags
Definition Player.h:577
KeyRingSlots
Definition Player.h:724
InventoryPackSlots
Definition Player.h:699
@ PLAYER_FLAGS_UNK28
Definition Player.h:496
@ PLAYER_FLAGS_PLAYED_LONG_TIME
Definition Player.h:480
@ PLAYER_FLAGS_UNK27
Definition Player.h:495
@ PLAYER_FLAGS_UNK26
Definition Player.h:494
@ PLAYER_FLAGS_UNK16
Definition Player.h:484
@ PLAYER_FLAGS_UNK20
Definition Player.h:488
@ PLAYER_FLAGS_TAXI_BENCHMARK
Definition Player.h:485
@ PLAYER_FLAGS_UNK24
Definition Player.h:492
@ PLAYER_FLAGS_UNK6
Definition Player.h:474
@ PLAYER_FLAGS_UNK31
Definition Player.h:499
@ PLAYER_FLAGS_UNK21
Definition Player.h:489
@ PLAYER_FLAGS_UNK29
Definition Player.h:497
@ PLAYER_FLAGS_UNK7
Definition Player.h:475
@ PLAYER_FLAGS_UBER
Definition Player.h:487
@ PLAYER_FLAGS_UNK30
Definition Player.h:498
@ PLAYER_FLAGS_PLAYED_TOO_LONG
Definition Player.h:481
CurrencyItems
Definition Player.h:954
ActionButtonUpdateState
Definition Player.h:222
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:210
std::list< uint32 > PlayerCreateInfoSpells
Definition Player.h:308
InstantFlightGossipAction
Definition Player.h:1012
std::unordered_map< uint32, time_t > InstanceTimeMap
Definition Player.h:211
std::map< uint32, bool > QuestStatusSaveMap
Definition Player.h:613
std::unordered_set< uint32 > RewardedQuestSet
Definition Player.h:610
RuneCooldowns
Definition Player.h:397
@ RUNE_MISS_COOLDOWN
Definition Player.h:400
std::list< PlayerCreateInfoItem > PlayerCreateInfoItems
Definition Player.h:282
PlayerFieldBytesOffsets
Definition Player.h:529
@ PLAYER_FIELD_BYTES_OFFSET_LIFETIME_MAX_PVP_RANK
Definition Player.h:533
@ PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES
Definition Player.h:532
@ PLAYER_FIELD_BYTES_OFFSET_RAF_GRANTABLE_LEVEL
Definition Player.h:531
@ PLAYER_FIELD_BYTES_OFFSET_FLAGS
Definition Player.h:530
PlayerCommandStates
Definition Player.h:992
@ CHEAT_COOLDOWN
Definition Player.h:996
@ CHEAT_WATERWALK
Definition Player.h:998
@ CHEAT_CASTTIME
Definition Player.h:995
PlayerDelayedOperations
Definition Player.h:897
RestFlag
Definition Player.h:808
@ ACTION_BUTTON_EQSET
Definition Player.h:233
@ ACTION_BUTTON_C
Definition Player.h:232
@ ACTION_BUTTON_MACRO
Definition Player.h:234
@ ACTION_BUTTON_CMACRO
Definition Player.h:235
BuyBackSlots
Definition Player.h:717
std::map< uint8, ActionButton > ActionButtonList
Definition Player.h:272
@ XPSOURCE_KILL
Definition Player.h:1004
InventorySlots
Definition Player.h:693
QuestSlotOffsets
Definition Player.h:616
std::unordered_map< uint32, SkillStatusData > SkillStatusMap
Definition Player.h:649
#define ACTION_BUTTON_TYPE(X)
Definition Player.h:245
PlayerMovementType
Definition Player.h:451
BankBagSlots
Definition Player.h:711
std::list< PlayerCreateInfoAction > PlayerCreateInfoActions
Definition Player.h:320
CurrencyTokenSlots
Definition Player.h:730
BuyBankSlotResult
Definition Player.h:111
@ ERR_BANKSLOT_NOTBANKER
Definition Player.h:114
@ ERR_BANKSLOT_FAILED_TOO_MANY
Definition Player.h:112
@ ERR_BANKSLOT_OK
Definition Player.h:115
@ ERR_BANKSLOT_INSUFFICIENT_FUNDS
Definition Player.h:113
BankItemSlots
Definition Player.h:705
PlayedTimeIndex
Definition Player.h:849
SpellModType
Definition Player.h:93
#define MAX_PLAYED_TIME_INDEX
Definition Player.h:854
PlayerUnderwaterState
Definition Player.h:100
InstanceResetWarningType
Definition Player.h:797
@ RAID_INSTANCE_EXPIRED
Definition Player.h:802
std::map< uint32, EquipmentSet > EquipmentSets
Definition Player.h:757
AtLoginFlags
Definition Player.h:593
@ AT_LOGIN_RESET_PET_TALENTS
Definition Player.h:599
@ AT_LOGIN_RESET_AP
Definition Player.h:603
@ AT_LOGIN_RESET_ARENA
Definition Player.h:604
@ AT_LOGIN_CHECK_ACHIEVS
Definition Player.h:605
PlayerBytes3Offsets
Definition Player.h:521
@ PLAYER_BYTES_3_OFFSET_PVP_TITLE
Definition Player.h:524
@ PLAYER_BYTES_3_OFFSET_GENDER
Definition Player.h:522
@ PLAYER_BYTES_3_OFFSET_ARENA_FACTION
Definition Player.h:525
std::ostringstream & operator<<(std::ostringstream &ss, PlayerTaxi const &taxi)
Definition PlayerTaxi.cpp:228
CharDeleteMethod
Definition Player.h:947
TalentTree
Definition Player.h:145
PlayerRestState
Definition Player.h:978
#define ACTION_BUTTON_ACTION(X)
Definition Player.h:244
std::list< EnchantDuration > EnchantDurationList
Definition Player.h:447
AdditionalSaving
Definition Player.h:985
@ ADDITIONAL_SAVING_NONE
Definition Player.h:986
PlayerBytesOffsets
Definition Player.h:505
@ PLAYER_BYTES_OFFSET_HAIR_COLOR_ID
Definition Player.h:509
@ PLAYER_BYTES_OFFSET_HAIR_STYLE_ID
Definition Player.h:508
@ PLAYER_BYTES_OFFSET_SKIN_ID
Definition Player.h:506
@ PLAYER_BYTES_OFFSET_FACE_ID
Definition Player.h:507
MirrorTimerType
Definition Player.h:567
SkillUpdateState
Definition Player.h:633
DrunkenState
Definition Player.h:457
PlayerFieldBytes2Offsets
Definition Player.h:537
@ PLAYER_FIELD_BYTES_2_OFFSET_OVERRIDE_SPELLS_ID
Definition Player.h:538
@ PLAYER_FIELD_BYTES_2_OFFSET_AURA_VISION
Definition Player.h:540
@ PLAYER_FIELD_BYTES_2_OFFSET_IGNORE_POWER_REGEN_PREDICTION_MASK
Definition Player.h:539
PlayerChatTag
Definition Player.h:839
std::map< uint32, QuestStatusData > QuestStatusMap
Definition Player.h:609
PlayerBytes2Offsets
Definition Player.h:513
@ PLAYER_BYTES_2_OFFSET_PARTY_TYPE
Definition Player.h:515
@ PLAYER_BYTES_2_OFFSET_BANK_BAG_SLOTS
Definition Player.h:516
@ PLAYER_BYTES_2_OFFSET_REST_STATE
Definition Player.h:517
@ PLAYER_BYTES_2_OFFSET_FACIAL_STYLE
Definition Player.h:514
EmoteBroadcastTextID
Definition Player.h:1017
@ EMOTE_BROADCAST_TEXT_ID_STRANGE_GESTURES
Definition Player.h:1018
PlayerSlots
Definition Player.h:657
PlayerLoginQueryIndex
Definition Player.h:858
@ MAX_PLAYER_LOGIN_QUERY
Definition Player.h:893
@ PLAYER_LOGIN_QUERY_LOAD_ACCOUNT_DATA
Definition Player.h:879
@ PLAYER_LOGIN_QUERY_LOAD_CORPSE_LOCATION
Definition Player.h:889
GuidList WhisperListContainer
Definition Player.h:198
std::list< Item * > ItemDurationList
Definition Player.h:448
ServerSideVisibilityType
Definition SharedDefines.h:1283
GameobjectTypes
Definition SharedDefines.h:1570
MailResponseType
Definition SharedDefines.h:3765
TradeStatus
Definition SharedDefines.h:3815
DuelCompleteType
Definition SharedDefines.h:3877
MailResponseResult
Definition SharedDefines.h:3775
BattlegroundQueueTypeId
Definition SharedDefines.h:3885
ReputationSource
Definition SharedDefines.h:191
RemoveMethod
Definition SharedDefines.h:3852
@ GROUP_REMOVEMETHOD_DEFAULT
Definition SharedDefines.h:3853
PartyResult
Definition SharedDefines.h:3970
SpellModOp
Definition SpellDefines.h:75
ClassContext
Definition UnitDefines.h:229
@ CLASS_CONTEXT_NONE
Definition UnitDefines.h:230
SheathState
Definition UnitDefines.h:125
BaseModType
Definition Unit.h:190
#define MOD_END
Definition Unit.h:195
DeathState
Definition Unit.h:198
Say
Definition boss_broodlord_lashlayer.cpp:29
Definition WorldSession.h:307
Definition CinematicMgr.h:33
Definition CharmInfo.h:80
Definition Object.h:359
void AddToUpdateQueueOf(Player *player)
Definition Item.cpp:744
void RemoveFromUpdateQueueOf(Player *player)
Definition Item.cpp:764
Definition LootMgr.h:207
Definition MapReference.h:25
Definition SocialMgr.h:101
Definition PlayerTaxi.h:26
uint32 GetBarberShopCost(uint8 newhairstyle, uint8 newhaircolor, uint8 newfacialhair, BarberShopStyleEntry const *newSkin=nullptr)
Definition Player.cpp:13296
void AddNewMailDeliverTime(time_t deliver_time)
Definition Player.cpp:2884
void ReputationChanged(FactionEntry const *factionEntry)
Definition PlayerQuest.cpp:2208
bool CanSpeak() const
Definition PlayerMisc.cpp:69
bool HasPendingSpectatorForBG(uint32 bgInstanceId) const
Definition Player.h:2580
std::string GetPlayerName()
Definition Player.cpp:16323
void CleanupChannels()
Definition Player.cpp:5021
void ProcessTerrainStatusUpdate() override
Definition PlayerUpdates.cpp:2234
void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex) override
Definition StatSystem.cpp:544
void SendInitialPacketsAfterAddToMap()
Definition Player.cpp:11645
void ResetSeasonalQuestStatus(uint16 event_id)
Definition Player.cpp:12226
uint32 GetPendingBind() const
Definition Player.h:2444
uint32 GetArmorProficiency() const
Definition Player.h:1360
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10107
void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError=0, ObjectGuid::LowType item_guid=0, uint32 item_count=0)
Definition Player.cpp:2860
SpellModList const & GetSpellModList(uint32 type) const
Definition Player.h:2612
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13527
std::set< uint32 > SeasonalQuestSet
Definition Player.h:2705
void RemoveRunesByAuraEffect(AuraEffect const *aura)
Definition Player.cpp:13433
bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12289
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
void SaveHealthBeforeDuel()
Definition Player.h:2161
void SendSystemMessage(std::string_view msg, bool escapeCharacters=false)
Definition Player.cpp:16385
void UpdateRuneRegen(RuneType rune)
Definition StatSystem.cpp:987
void removeActionButton(uint8 button)
Definition Player.cpp:5656
void SetNeedZoneUpdate(bool needUpdate)
Definition Player.h:1855
void HandleFall(MovementInfo const &movementInfo)
Definition Player.cpp:13900
std::size_t GetRewardedQuestCount() const
Definition Player.h:1624
void SetSummonPoint(uint32 mapid, float x, float y, float z, uint32 delay=0, bool asSpectator=false)
Definition Player.cpp:16345
uint8 GetChatTag() const
Definition Player.cpp:1322
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5626
void setTeamId(TeamId teamid)
Definition Player.h:2110
void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask)
Definition Player.cpp:10131
uint64 GetAuraUpdateMaskForRaid() const
Definition Player.h:2479
void AddBonusTalent(uint32 count)
Definition Player.h:1731
void RemoveSpellMods(Spell *spell)
Definition Player.cpp:10029
void ToggleMetaGemsActive(uint8 exceptslot, bool apply)
Definition Player.cpp:11270
uint32 GetSaveTimer() const
Definition Player.h:2360
void RewardExtraBonusTalentPoints(uint32 bonusTalentPoints)
Definition Player.cpp:6079
uint8 GetRank() const
Definition Player.h:1894
bool HasQuestForGO(int32 GOId) const
Definition Player.cpp:12432
bool HasTankSpec()
Definition Player.cpp:16083
bool UpdateFishingSkill()
Definition PlayerUpdates.cpp:886
bool isGMVisible() const
Definition Player.h:1170
bool GetRandomWinner()
Definition Player.h:2295
void SetGuildIdInvited(uint32 GuildId)
Definition Player.h:1895
uint32 GetFreeInventorySpace() const
Definition PlayerStorage.cpp:467
void SetSummonAsSpectator(bool on)
Definition Player.h:1101
void SendRemoveControlBar()
Definition Player.cpp:9781
void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool onEnterMap)
Definition Player.cpp:11786
static uint32 GetZoneIdFromDB(ObjectGuid guid)
Definition Player.cpp:6343
void SummonIfPossible(bool agree, ObjectGuid summoner_guid)
Definition Player.cpp:12468
void SetFarSightDistance(float radius)
Definition Player.cpp:16285
void SetLastUsedRune(RuneType type)
Definition Player.h:2517
float GetMissPercentageFromDefence() const
Definition StatSystem.cpp:725
bool IsInWhisperWhiteList(ObjectGuid guid)
Definition Player.cpp:16007
bool isResurrectRequestedBy(ObjectGuid guid) const
Definition Player.h:1822
uint32 GetTemporaryUnsummonedPetNumber() const
Definition Player.h:2417
std::string autoReplyMsg
Definition Player.h:1139
uint32 GetCurrentBattlegroundQueueSlot() const
Definition Player.h:2260
bool IsWorldObjectOutOfSightRange(WorldObject const *target) const
Definition Player.cpp:16309
RewardedQuestSet const & getRewardedQuests() const
Definition Player.h:1620
InventoryResult CanRollForItemInLFG(ItemTemplate const *item, WorldObject const *lootedObject) const
Definition PlayerStorage.cpp:2343
void SetInWater(bool apply)
Definition Player.cpp:2161
bool HasWeapon(WeaponAttackType type) const override
Definition Player.h:1257
void ClearAfkReports()
Definition Player.h:2288
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
void DestroyForPlayer(Player *target, bool onDeath=false) const override
Definition Player.cpp:3860
void SplitItem(uint16 src, uint16 dst, uint32 count)
Definition PlayerStorage.cpp:3420
void _LoadFriendList(PreparedQueryResult result)
bool IsInvitedForBattlegroundInstance() const
Definition Player.h:2261
void ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs) override
Definition Player.cpp:10558
void SetGrantableLevels(uint8 val)
Definition Player.h:2123
uint32 DoRandomRoll(uint32 minimum, uint32 maximum)
Definition Player.cpp:16192
bool HasMeleeSpec()
Definition Player.cpp:16101
void SendAttackSwingDeadTarget()
Definition PlayerMisc.cpp:128
Item * GetItemByEntry(uint32 entry) const
Definition PlayerStorage.cpp:3368
std::unordered_map< ObjectGuid::LowType, Item * > ItemMap
Definition Player.h:1658
void BuildEnchantmentsInfoData(WorldPacket *data)
Definition Player.cpp:14551
void SetCanParry(bool value)
Definition Player.cpp:13172
GroupReference & GetGroupRef()
Definition Player.h:2474
uint32 GetInGameTime()
Definition Player.h:1549
GroupReference & GetOriginalGroupRef()
Definition Player.h:2488
void UpdatePotionCooldown(Spell *spell=nullptr)
Definition PlayerUpdates.cpp:1543
bool CanTameExoticPets() const
Definition Player.h:2189
bool CanFly() const override
Definition Player.h:2569
void CharmSpellInitialize()
Definition Player.cpp:9727
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1025
void SetTemporaryUnsummonedPetNumber(uint32 petnumber)
Definition Player.h:2418
DeclinedName const * GetDeclinedNames() const
Definition Player.h:2508
void ReputationChanged2(FactionEntry const *factionEntry)
Definition PlayerQuest.cpp:2236
static void Customize(CharacterCustomizeInfo const *customizeInfo, CharacterDatabaseTransaction trans)
Definition PlayerMisc.cpp:114
BGData & GetBGData()
Definition Player.h:2263
void Update(uint32 time) override
Definition PlayerUpdates.cpp:53
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Player.h:2480
void CleanupsBeforeDelete(bool finalCleanup=true) override
Definition Player.cpp:474
void UpdateEnchantmentDurations()
Definition PlayerStorage.cpp:4740
float GetTotalBaseModValue(BaseModGroup modGroup) const
Definition Player.cpp:5091
bool CanUseBattlegroundObject(GameObject *gameobject) const
Definition Player.cpp:13266
void GetTalentTreePoints(uint8(&specPoints)[3]) const
Definition Player.cpp:15399
bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const
Definition Player.cpp:12280
static void OfflineResurrect(ObjectGuid const &guid, CharacterDatabaseTransaction trans)
Definition Player.cpp:4602
uint32 GetDeathTimer() const
Definition Player.h:2176
bool UpdateCraftSkill(uint32 spellid)
Definition PlayerUpdates.cpp:824
void SendQuestConfirmAccept(Quest const *quest, Player *pReceiver)
Definition PlayerQuest.cpp:2413
void SetEntryPoint()
Definition Player.cpp:11303
bool IsMirrorTimerActive(MirrorTimerType type)
Definition Player.h:2060
bool CanKnockback()
Definition Player.h:2503
void SetPendingFlightChange(uint32 counter)
Definition Player.h:2640
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4836
void SetDeveloper(bool on)
Definition Player.h:1157
void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot, uint8 type)
Definition Player.h:1902
void CompletedAchievement(AchievementEntry const *entry)
Definition Player.cpp:13988
std::set< uint32 > DFQuestsDoneList
Definition Player.h:2413
bool inRandomLfgDungeon()
Definition Player.cpp:13120
void SetCanKnockback(bool value)
Definition Player.h:2504
bool IsInWater() const override
Definition Player.h:1121
void TalkedToCreature(uint32 entry, ObjectGuid guid)
Definition PlayerQuest.cpp:2112
bool canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const *bySpell)
Definition Player.cpp:13691
void RemoveMail(uint32 id)
Definition Player.cpp:2847
void setWeaponChangeTimer(uint32 time)
Definition Player.h:1601
void RemoveFromBattlegroundOrBattlefieldRaid()
Definition Player.cpp:13147
void LoadActions(PreparedQueryResult result)
Definition Player.cpp:15391
QuestGiverStatus GetQuestDialogStatus(Object *questGiver)
Definition PlayerQuest.cpp:1595
void AddInstanceEnterTime(uint32 instanceId, time_t enterTime)
Definition Player.h:2454
uint32 GetGuildIdInvited()
Definition Player.h:1898
bool HasCorpse() const
Definition Player.h:2037
void SendInitialPacketsBeforeAddToMap()
Definition Player.cpp:11588
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition PlayerQuest.cpp:1818
void setRegenTimerCount(uint32 time)
Definition Player.h:1600
bool HasReceivedSpectatorResetFor(ObjectGuid guid)
Definition Player.h:2583
void ResetMap() override
Definition Player.cpp:14781
void ResurectUsingRequestData()
Definition Player.cpp:12872
void RemoveRestState()
Definition Player.cpp:1096
void SendDungeonDifficulty(bool IsInGroup)
Definition PlayerMisc.cpp:167
void AddItemToBuyBackSlot(Item *pItem, uint32 money)
Definition PlayerStorage.cpp:3935
void ResetMonthlyQuestStatus()
Definition Player.cpp:12236
void ResetDailyQuestStatus()
Definition Player.cpp:12204
void Initialize(ObjectGuid::LowType guid)
Definition PlayerStorage.cpp:4786
bool CheckInstanceCount(uint32 instanceId) const
Definition PlayerStorage.cpp:6994
void UpdateTriggerVisibility()
Definition PlayerUpdates.cpp:1732
void SetGMSpectator(bool on)
Definition Player.h:1166
std::vector< Unit * > m_newVisible
Definition Player.h:2386
void SetReputation(uint32 factionentry, float value)
Definition Player.cpp:15451
void ResyncRunes(uint8 count)
Definition Player.cpp:13474
bool UpdateStats(Stats stat) override
Definition StatSystem.cpp:97
void KilledMonster(CreatureTemplate const *cInfo, ObjectGuid guid)
Definition PlayerQuest.cpp:1915
void SwapItem(uint16 src, uint16 dst)
Definition PlayerStorage.cpp:3535
bool BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uint32 item, uint8 count, uint8 bag, uint8 slot)
Definition Player.cpp:10730
void SetRestState(uint32 triggerId)
Definition Player.cpp:1089
bool HasItemTotemCategory(uint32 TotemCategory) const
Definition PlayerStorage.cpp:852
void AddReceivedSpectatorResetFor(ObjectGuid guid)
Definition Player.h:2585
uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry)
Definition PlayerQuest.cpp:1751
void RemoveAmmo()
Definition PlayerStorage.cpp:2520
bool Create(ObjectGuid::LowType guidlow, CharacterCreateInfo *createInfo)
Definition Player.cpp:482
uint8 GetRunesState() const
Definition Player.h:2509
void SendDuelCountdown(uint32 counter)
Definition Player.cpp:15466
void SetAtLoginFlag(AtLoginFlags f)
Definition Player.h:2407
void BuildCreateUpdateBlockForPlayer(UpdateData *data, Player *target) override
Definition Player.cpp:3829
void SetCanBlock(bool value)
Definition Player.cpp:13181
bool IsDeserter() const
Definition Player.h:2268
bool InBattlegroundQueue(bool ignoreArena=false) const
Definition Player.cpp:12255
int16 GetSkillTempBonusValue(uint32 skill) const
Definition Player.cpp:5558
void RestoreBaseRune(uint8 index)
Definition Player.cpp:13445
int16 GetSkillPermBonusValue(uint32 skill) const
Definition Player.cpp:5546
void SendRaidInfo()
Definition PlayerStorage.cpp:6533
void DeleteEquipmentSet(uint64 setGuid)
Definition Player.cpp:14740
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12563
bool CanTeleport()
Definition Player.h:2501
void SetBattlegroundId(uint32 id, BattlegroundTypeId bgTypeId, uint32 queueSlot, bool invited, bool isRandom, TeamId teamId)
Definition Player.cpp:12356
void DestroyConjuredItems(bool update)
Definition PlayerStorage.cpp:3341
uint32 GetPendingFlightChange() const
Definition Player.h:2639
bool CanPetResurrect()
Definition Player.cpp:9232
void SetCommandStatusOn(uint32 command)
Definition Player.h:1185
void LearnTalent(uint32 talentId, uint32 talentRank, bool command=false)
Definition Player.cpp:13993
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1971
bool IsNeverVisible() const override
Definition Player.cpp:11451
void AddMail(Mail *mail)
Definition Player.h:1643
PlayerSetting GetPlayerSetting(std::string const &source, uint32 index)
Definition PlayerSettings.cpp:132
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val)
Definition Player.cpp:12318
void SetTarget(ObjectGuid=ObjectGuid::Empty) override
Definition Player.h:1633
void ResetFarSightDistance()
Definition Player.cpp:16290
bool RemoveMItem(ObjectGuid::LowType itemLowGuid)
Definition Player.h:1675
float GetBaseModValue(BaseModGroup modGroup, BaseModType modType) const
Definition Player.cpp:5077
void SetPassOnGroupLoot(bool bPassOnGroupLoot)
Definition Player.h:2492
void SendSellError(SellResult msg, Creature *creature, ObjectGuid guid, uint32 param)
Definition PlayerStorage.cpp:4075
static uint32 GetArenaTeamIdFromDB(ObjectGuid guid, uint8 slot)
Definition Player.cpp:6329
void ClearWhisperWhiteList()
Definition Player.h:2564
void RemoveCorpse()
Definition Player.cpp:4692
bool CanAlwaysSee(WorldObject const *obj) const override
Definition Player.cpp:11462
void SwapQuestSlot(uint16 slot1, uint16 slot2)
Definition Player.h:1504
ObjectGuid GetDivider()
Definition Player.h:1546
uint16 GetSkillStep(uint16 skill) const
Definition Player.cpp:5457
std::string const & GetGuildName()
Definition Player.cpp:15461
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12776
void UpdateSpecCount(uint8 count)
Definition PlayerUpdates.cpp:2177
CinematicMgr * GetCinematicMgr() const
Definition Player.h:1378
void UpdateFallInformationIfNeed(MovementInfo const &minfo, uint16 opcode)
Definition PlayerUpdates.cpp:2169
void SendRespondInspectAchievements(Player *player) const
Definition Player.cpp:13963
bool HasHealSpec()
Definition Player.cpp:16147
std::unordered_map< uint32, SeasonalQuestSet > SeasonalEventQuestMap
Definition Player.h:2706
bool CanNoReagentCast(SpellInfo const *spellInfo) const
Definition Player.cpp:12613
void LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRank)
Definition Player.cpp:14126
uint32 m_AreaID
Definition Player.h:2673
uint32 DurabilityRepairAll(bool cost, float discountMod, bool guildBank)
Definition Player.cpp:4842
std::set< uint32 > QuestSet
Definition Player.h:2704
void SetBGData(BGData &bgdata)
Definition Player.h:2264
bool HasWeaponForAttack(WeaponAttackType type) const override
Definition Player.h:1258
bool HasQuest(uint32 questId) const
Definition PlayerQuest.cpp:101
void SendResetFailedNotify(uint32 mapid)
Definition PlayerMisc.cpp:187
uint32 GetSpellByProto(ItemTemplate *proto)
void SendAttackSwingCantAttack()
Definition PlayerMisc.cpp:134
void RestoreManaAfterDuel()
Definition Player.h:2164
void RemoveFromWhisperWhiteList(ObjectGuid guid)
Definition Player.h:2567
bool IsFreeFlying() const
Definition Player.h:2571
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3543
PartyResult CanUninviteFromGroup(ObjectGuid targetPlayerGUID=ObjectGuid::Empty) const
Definition Player.cpp:13057
void MoveItemToInventory(ItemPosCountVec const &dest, Item *pItem, bool update, bool in_characterInventoryDB=false)
Definition PlayerStorage.cpp:2999
uint32 GetBaseSpellHealingBonus()
Definition Player.h:1970
ActionButton const * GetActionButton(uint8 button)
Definition Player.cpp:5670
bool CanJoinToBattleground() const
Definition Player.cpp:11378
void RestoreHealthAfterDuel()
Definition Player.h:2163
bool IsAtLootRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12830
void RestoreAllSpellMods(uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:10022
void SendQuestUpdateAddItem(Quest const *quest, uint32 item_idx, uint16 count)
Definition PlayerQuest.cpp:2447
uint32 GetWeaponProficiency() const
Definition Player.h:1359
void RemoveReceivedSpectatorResetFor(ObjectGuid guid)
Definition Player.h:2586
void SetBonusTalentCount(uint32 count)
Definition Player.h:1729
Item * GetShield(bool useable=false) const
Definition PlayerStorage.cpp:524
~Player() override
Definition Player.cpp:425
SpellCooldowns const & GetSpellCooldownMap() const
Definition Player.h:1771
bool HasFreeBattlegroundQueueId() const
Definition Player.cpp:12309
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14418
uint32 GetBaseSpellDamageBonus()
Definition Player.h:1969
void SetInGuild(uint32 GuildId)
Definition Player.h:1887
void AddRuneByAuraEffect(uint8 index, RuneType newType, AuraEffect const *aura)
Definition Player.h:2523
void SetCommentator(bool on)
Definition Player.h:1155
void ClearChannelWatch()
Definition Player.cpp:5031
void ProcessDelayedOperations()
Definition Player.cpp:1614
float GetAverageItemLevel()
Definition Player.cpp:15840
bool HasSpellItemCooldown(uint32 spell_id, uint32 itemid) const override
Definition Player.cpp:16366
ObjectGuid getRuneWeaponGUID()
Definition Player.h:2593
float GetExpertiseDodgeOrParryReduction(WeaponAttackType attType) const
Definition Player.cpp:5222
void UpdateResistances(uint32 school) override
Definition StatSystem.cpp:242
void SetCommandStatusOff(uint32 command)
Definition Player.h:1186
void setRuneWeaponGUID(ObjectGuid guid)
Definition Player.h:2592
bool IsActiveQuest(uint32 quest_id) const
Definition PlayerQuest.cpp:202
void ClearReceivedSpectatorResetFor()
Definition Player.h:2584
void ResetWeeklyQuestStatus()
Definition Player.cpp:12216
float GetRealParry() const
Definition Player.h:2607
uint32 GetNextSave() const
Definition Player.h:2611
void SetChampioningFaction(uint32 faction)
Definition Player.h:2557
void SendMovieStart(uint32 MovieId)
Definition Player.cpp:5727
LootItem * StoreLootItem(uint8 lootSlot, Loot *loot, InventoryResult &msg)
Definition Player.cpp:13563
void LoadCorpse(PreparedQueryResult result)
Definition PlayerStorage.cpp:5821
uint32 AddBattlegroundQueueId(BattlegroundQueueTypeId val)
Definition Player.cpp:12294
void SendCinematicStart(uint32 CinematicSequenceId) const
Definition Player.cpp:5716
void LoadPet()
Definition PlayerStorage.cpp:6222
bool isResurrectRequested() const
Definition Player.h:1823
bool IsGMSpectator() const
Definition Player.h:1165
Optional< float > GetFarSightDistance() const
Definition Player.cpp:16295
void SetEquipmentSet(uint32 index, EquipmentSet eqset)
Definition Player.cpp:14624
void UpdateMirrorTimers()
Definition PlayerUpdates.cpp:429
void ModifySkillBonus(uint32 skillid, int32 val, bool talent)
Definition Player.cpp:5328
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2168
TrainerSpellState GetTrainerSpellState(TrainerSpell const *trainer_spell) const
Definition Player.cpp:3909
uint32 GetLastPetNumber() const
Definition Player.h:2461
uint8 getCinematic() const
Definition Player.h:1826
uint32 GetBonusTalentCount()
Definition Player.h:1730
void DurabilityPointsLossAll(int32 points, bool inventory)
Definition Player.cpp:4780
bool IsVisibleGloballyFor(Player const *player) const
Definition Player.cpp:11496
uint32 GetLevelPlayedTime()
Definition Player.h:1193
void SetPendingSpectatorInviteInstanceId(uint32 bgInstanceId)
Definition Player.h:2581
bool IsBeingTeleportedNear() const
Definition Player.h:2091
Seconds GetCreationTime() const
Definition Player.h:2543
void SaveManaBeforeDuel()
Definition Player.h:2162
time_t GetSummonExpireTimer() const
Definition Player.h:1103
void SetRank(uint8 rankId)
Definition Player.h:1893
Pet * CreatePet(Creature *creatureTarget, uint32 spellID=0)
Definition Player.cpp:9271
void ToggleAFK()
Definition Player.cpp:1308
void SetExpectingChangeTransport(bool state)
Definition Player.h:2637
Pet * SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, Milliseconds duration=0ms, uint32 healthPct=0)
Definition Player.cpp:9000
void OnGossipSelect(WorldObject *source, uint32 gossipListId, uint32 menuId)
Definition PlayerGossip.cpp:244
void PossessSpellInitialize()
Definition Player.cpp:9624
bool LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const &holder)
Definition PlayerStorage.cpp:4924
AchievementMgr * GetAchievementMgr() const
Definition Player.h:2540
std::vector< Item * > & GetItemUpdateQueue()
Definition Player.h:1261
SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const override
Definition Player.cpp:7061
bool TakeQuestSourceItem(uint32 questId, bool msg)
Definition PlayerQuest.cpp:1363
Item * GetMItem(ObjectGuid::LowType itemLowGuid)
Definition Player.h:1662
void SetSheath(SheathState sheathed) override
Definition PlayerStorage.cpp:98
Item * GetItemFromBuyBackSlot(uint32 slot)
Definition PlayerStorage.cpp:3986
void SetBeastMaster(bool on)
Definition Player.h:1158
bool HasCasterSpec()
Definition Player.cpp:16124
void UpdateLFGChannel()
Definition PlayerUpdates.cpp:464
static bool LoadPositionFromDB(uint32 &mapid, float &x, float &y, float &z, float &o, bool &in_flight, ObjectGuid::LowType guid)
Definition PlayerStorage.cpp:4881
static bool BuildEnumData(PreparedQueryResult result, WorldPacket *data)
Definition Player.cpp:1103
SkillStatusMap const & GetSkillStatusMap() const
Definition Player.h:1774
bool IsDailyQuestDone(uint32 quest_id)
Definition Player.cpp:12166
void UpdateSpeakTime(ChatFloodThrottle::Index index)
Definition PlayerMisc.cpp:29
bool Satisfy(DungeonProgressionRequirements const *ar, uint32 target_map, bool report=false)
Definition PlayerStorage.cpp:6719
bool IsAlwaysDetectableFor(WorldObject const *seer) const override
Definition Player.cpp:11475
void AddArmorProficiency(uint32 newflag)
Definition Player.h:1358
void KillCreditGO(uint32 entry, ObjectGuid guid=ObjectGuid::Empty)
Definition PlayerQuest.cpp:2056
bool IsFalling() const
Definition Player.cpp:2155
std::list< Channel * > JoinedChannelsList
Definition Player.h:2860
void ResetAllPowers()
Definition Player.cpp:2035
Quest const * GetNextQuest(ObjectGuid guid, Quest const *quest)
Definition PlayerQuest.cpp:207
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12902
uint32 GetGroupUpdateFlag() const
Definition Player.h:2477
void SetHomebind(WorldLocation const &loc, uint32 areaId)
Definition PlayerStorage.cpp:4902
uint32 GetArenaTeamIdInvited()
Definition Player.h:1913
void SetSaveTimer(uint32 timer)
Definition Player.h:2361
bool CanShareQuest(uint32 quest_id) const
Definition PlayerQuest.cpp:1458
Player * GetSelectedPlayer() const
Definition Player.cpp:11557
void ModifySpellCooldown(uint32 spellId, int32 cooldown)
Definition Player.cpp:11112
void AddWhisperWhiteList(ObjectGuid guid)
Definition Player.h:2565
bool GetPassOnGroupLoot() const
Definition Player.h:2493
Unit * GetSelectedUnit() const
Definition Player.cpp:11549
Player * GetNextRandomRaidMember(float radius)
Definition Player.cpp:13031
void AddToWorld() override
Definition Player.cpp:1698
void RemoveAllSpellCooldown()
Definition Player.cpp:3586
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
Definition Player.cpp:13978
void SetIsSpectator(bool on)
Definition Player.cpp:15473
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12719
uint32 GetPhaseMaskForSpawn() const
Definition Player.cpp:13822
bool CanRequestSpellCast(SpellInfo const *spellInfo)
Definition PlayerUpdates.cpp:2320
uint32 GetMapChangeOrderCounter()
Definition Player.h:2643
float GetRealDodge() const
Definition Player.h:2608
void SetShowDKPet(bool on)
Definition Player.h:2597
void SetDivider(ObjectGuid guid=ObjectGuid::Empty)
Definition Player.h:1547
bool IsCurrentBattlegroundRandom() const
Definition Player.h:2262
uint8 GetMostPointsTalentTree() const
Definition Player.cpp:15420
static void ResetInstances(ObjectGuid guid, uint8 method, bool isRaid)
Reset all solo instances and optionally send a message on success for each.
Definition PlayerMisc.cpp:195
void UninviteFromGroup()
Definition Player.cpp:2315
void KilledPlayerCredit(uint16 count=1)
Definition PlayerQuest.cpp:1995
void VehicleSpellInitialize()
Definition Player.cpp:9652
void AbandonQuest(uint32 quest_id)
Definition PlayerQuest.cpp:930
void RemoveRewardedQuest(uint32 questId, bool update=true)
Definition PlayerQuest.cpp:1513
void Yell(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles yelled message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9433
void CastItemUseSpell(Item *item, SpellCastTargets const &targets, uint8 cast_count, uint32 glyphIndex)
Definition Player.cpp:7432
bool IsExpectingChangeTransport() const
Definition Player.h:2636
std::string GetDebugInfo() const override
Definition Player.cpp:16378
void SetTaxiCheater(bool on)
Definition Player.h:1169
void TextEmote(std::string_view text, WorldObject const *=nullptr, bool=false) override
Outputs an universal text which is supposed to be an action.
Definition Player.cpp:9459
void ReportedAfkBy(Player *reporter)
This player has been blamed to be inactive in a battleground.
Definition Player.cpp:11397
time_t GetSemaphoreTeleportNear() const
Definition Player.h:2095
void RefundItem(Item *item)
Definition Player.cpp:15708
void SetArenaTeamIdInvited(uint32 ArenaTeamId)
Definition Player.h:1912
void Whisper(std::string_view text, Language language, Player *receiver, bool=false) override
Handles whispers from Addons and players based on sender, receiver's guid and language.
Definition Player.cpp:9485
void AddSpellMod(SpellModifier *mod, bool apply)
Definition Player.cpp:9910
void ToggleDND()
Definition Player.cpp:1317
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14282
void AddRunePower(uint8 index)
Definition Player.cpp:13486
RuneType GetLastUsedRune()
Definition Player.h:2516
void RemovedInsignia(Player *looterPlr)
Definition Player.cpp:7792
void RemoveFromWorld() override
Definition Player.cpp:1710
void UpdateEnergyRegen()
Definition StatSystem.cpp:977
void JoinedChannel(Channel *c)
Definition Player.cpp:5011
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14328
bool CanEnterWater() const override
Definition Player.h:2570
WorldLocation GetStartPosition() const
Definition Player.cpp:11422
void AddWeaponProficiency(uint32 newflag)
Definition Player.h:1357
void RemoveBonusTalent(uint32 count)
Definition Player.h:1732
static void SavePositionInDB(uint32 mapid, float x, float y, float z, float o, uint32 zone, ObjectGuid guid)
Definition PlayerMisc.cpp:84
bool IsSummonAsSpectator() const
Definition Player.cpp:16355
void SetPendingSpectatorForBG(uint32 bgInstanceId)
Definition Player.h:2579
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1864
bool IsOutdoorPvPActive()
Definition Player.cpp:6431
void SetInGameTime(uint32 time)
Definition Player.h:1551
uint32 GetPendingSpectatorInviteInstanceId() const
Definition Player.h:2582
bool CanInteractWithQuestGiver(Object *questGiver)
Definition Player.cpp:2056
uint32 GetQuestSlotTime(uint16 slot) const
Definition Player.h:1485
Mail * GetMail(uint32 id)
Definition Player.cpp:3817
BattlegroundQueueTypeId GetBattlegroundQueueTypeId(uint32 index) const
Definition Player.cpp:12266
void SetBankBagSlotCount(uint8 count)
Definition Player.h:1272
uint8 GetGrantableLevels()
Definition Player.h:2122
WorldObject * GetSeer() const
Definition Player.h:2354
uint32 GetDelayedOperations() const
Definition Player.h:2098
void setCinematic(uint8 cine)
Definition Player.h:1830
bool CheckInstanceLoginValid()
Definition PlayerStorage.cpp:6965
void SetLastPetNumber(uint32 petnumber)
Definition Player.h:2462
bool isTaxiCheater() const
Definition Player.h:1168
uint32 GetQuestSlotState(uint16 slot) const
Definition Player.h:1483
void SetBattlegroundOrBattlefieldRaid(Group *group, int8 subgroup=-1)
Definition Player.cpp:13131
InventoryResult CanStoreItems(Item **pItem, int32 count) const
Definition PlayerStorage.cpp:1540
void SetSession(WorldSession *sess)
Definition Player.h:1999
void RemoveArenaEnchantments(EnchantmentSlot slot)
Definition PlayerStorage.cpp:4224
void resetSpells()
Definition Player.cpp:11869
bool CanCaptureTowerPoint() const
Definition Player.cpp:13288
void SetInviteForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId, uint32 instanceId)
Definition Player.cpp:12331
GuidSet RefundableItemsSet
Definition Player.h:2950
void SendNotifyLootMoneyRemoved()
Definition Player.cpp:8231
bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const
Definition Player.cpp:12368
void SetRandomWinner(bool isWinner)
Definition Player.cpp:15823
void RewardPlayerAndGroupAtEvent(uint32 creature_id, WorldObject *pRewardSource)
Definition Player.cpp:12781
QuestStatusSaveMap & GetQuestStatusSaveMap()
Definition Player.h:1622
void RemoveArenaSpellCooldowns(bool removeActivePetCooldowns=false)
Definition Player.cpp:3551
void ResetAchievements()
Definition Player.cpp:13958
bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator=1)
Definition PlayerUpdates.cpp:762
time_t GetSemaphoreTeleportFar() const
Definition Player.h:2096
Definition QueryHolder.h:44
Definition UnitUtils.h:47
Definition Spell.h:119
Seconds const StartTime
Definition GameTime.cpp:25
Items
Definition oculus.h:74
Definition Player.h:385
Definition Player.h:1027
Definition DBCStructure.h:590
uint32 bit_index
Definition DBCStructure.h:639
Definition WorldSession.h:338
Definition Player.h:373
Definition Player.h:937
Definition Player.h:1044
Definition Object.h:288
Definition Player.h:292
Definition Player.h:311
Definition Player.h:275
Definition Player.h:323
Definition PlayerSettings.h:40
BattlegroundQueueTypeId bgQueueTypeId
Definition Player.h:2685
uint32 invitedToInstance
Definition Player.h:2686
uint32 Count
Definition Player.h:2327
time_t Time
Definition Player.h:2326
Index
Definition Player.h:2320
@ MAX
Definition Player.h:2323
Definition Player.h:353
Definition Player.h:413
Definition Player.h:769
Definition CreatureData.h:507

Referenced by SendInitWorldStates().

◆ duel

◆ healthBeforeDuel

uint32 Player::healthBeforeDuel
private

◆ isDebugAreaTriggers

◆ ItemSetEff

std::vector<ItemSetEffect*> Player::ItemSetEff

◆ m_achievementMgr

◆ m_actionButtons

◆ m_activeSpec

◆ m_additionalSaveMask

uint8 Player::m_additionalSaveMask
protected

◆ m_additionalSaveTimer

uint16 Player::m_additionalSaveTimer
protected

◆ m_ammoDPS

float Player::m_ammoDPS
protected

◆ m_AreaID

uint32 Player::m_AreaID
protected

◆ m_areaUpdateId

uint32 Player::m_areaUpdateId
protected

◆ m_ArenaTeamIdInvited

uint32 Player::m_ArenaTeamIdInvited
protected

◆ m_ArmorProficiency

uint32 Player::m_ArmorProficiency
protected

◆ m_atLoginFlags

uint32 Player::m_atLoginFlags
protected

◆ m_auraBaseMod

◆ m_auraRaidUpdateMask

◆ m_baseFeralAP

uint32 Player::m_baseFeralAP
protected

◆ m_baseHealthRegen

uint32 Player::m_baseHealthRegen
protected

◆ m_baseManaRegen

uint32 Player::m_baseManaRegen
protected

◆ m_baseRatingValue

int32 Player::m_baseRatingValue[MAX_COMBAT_RATING]
protected

◆ m_baseSpellDamage

uint32 Player::m_baseSpellDamage
protected

◆ m_baseSpellHealing

uint32 Player::m_baseSpellHealing
protected

◆ m_baseSpellPower

uint32 Player::m_baseSpellPower
protected

◆ m_bgData

◆ m_bHasDelayedTeleport

bool Player::m_bHasDelayedTeleport
private

◆ m_bMustDelayTeleport

bool Player::m_bMustDelayTeleport
private

◆ m_bPassOnGroupLoot

bool Player::m_bPassOnGroupLoot
protected

◆ m_canBlock

bool Player::m_canBlock
protected

Referenced by CanBlock(), Player(), and SetCanBlock().

◆ m_canKnockback

bool Player::m_canKnockback
private

◆ m_canParry

bool Player::m_canParry
protected

Referenced by CanParry(), Player(), and SetCanParry().

◆ m_canTeleport

bool Player::m_canTeleport
private

Referenced by CanTeleport(), Player(), and SetCanTeleport().

◆ m_canTitanGrip

bool Player::m_canTitanGrip
protected

◆ m_ChampioningFaction

uint32 Player::m_ChampioningFaction
private

◆ m_channels

◆ m_charmAISpells

uint32 Player::m_charmAISpells[NUM_CAI_SPELLS]
protected

◆ m_charmUpdateTimer

uint32 Player::m_charmUpdateTimer

Referenced by Player(), and Update().

◆ m_charSettingsMap

◆ m_chatFloodData

std::array<ChatFloodThrottle, ChatFloodThrottle::MAX> Player::m_chatFloodData
protected

Referenced by UpdateSpeakTime().

◆ m_cinematic

uint8 Player::m_cinematic
protected

◆ m_contestedPvPTimer

uint32 Player::m_contestedPvPTimer
protected

◆ m_creationTime

Seconds Player::m_creationTime
private

◆ m_currentBuybackSlot

uint32 Player::m_currentBuybackSlot
protected

◆ m_DailyQuestChanged

bool Player::m_DailyQuestChanged
protected

◆ m_deathExpireTime

◆ m_deathTimer

◆ m_declinedname

DeclinedName* Player::m_declinedname
protected

◆ m_DelayedOperations

uint32 Player::m_DelayedOperations
private

◆ m_DFQuests

◆ m_divider

ObjectGuid Player::m_divider
protected

Referenced by GetDivider(), and SetDivider().

◆ m_drunkTimer

uint32 Player::m_drunkTimer
protected

◆ m_drwGUID

ObjectGuid Player::m_drwGUID

◆ m_dungeonDifficulty

Difficulty Player::m_dungeonDifficulty
protected

◆ m_enchantDuration

◆ m_entryPointData

◆ m_EquipmentSets

◆ m_Expertise

float Player::m_Expertise
protected

◆ m_extraBonusTalentCount

◆ m_ExtraFlags

◆ m_flightSpellActivated

uint32 Player::m_flightSpellActivated
private

◆ m_foodEmoteTimerCount

uint32 Player::m_foodEmoteTimerCount
protected

Referenced by Player(), and RegenerateAll().

◆ m_forced_speed_changes

uint8 Player::m_forced_speed_changes[MAX_MOVE_TYPE]

◆ m_GlobalCooldownMgr

GlobalCooldownMgr Player::m_GlobalCooldownMgr
protected

Referenced by GetGlobalCooldownMgr().

◆ m_Glyphs

◆ m_grantableLevels

uint8 Player::m_grantableLevels
protected

◆ m_group

◆ m_groupInvite

Group* Player::m_groupInvite
protected

Referenced by GetGroupInvite(), and SetGroupInvite().

◆ m_groupUpdateMask

uint32 Player::m_groupUpdateMask
protected

◆ m_GuildIdInvited

uint32 Player::m_GuildIdInvited
protected

◆ m_homebindAreaId

uint16 Player::m_homebindAreaId

◆ m_homebindMapId

◆ m_HomebindTimer

uint32 Player::m_HomebindTimer

Referenced by Player(), and UpdateHomebindTime().

◆ m_homebindX

◆ m_homebindY

◆ m_homebindZ

◆ m_hostileReferenceCheckTimer

uint16 Player::m_hostileReferenceCheckTimer
protected

Referenced by Player(), and Update().

◆ m_ingametime

uint32 Player::m_ingametime
protected

◆ m_InstanceValid

◆ m_IsBGRandomWinner

bool Player::m_IsBGRandomWinner
protected

◆ m_isInSharedVisionOf

std::set<Unit*> Player::m_isInSharedVisionOf

◆ m_isInstantFlightOn

bool Player::m_isInstantFlightOn
private

◆ m_isInWater

bool Player::m_isInWater
private

Referenced by IsInWater(), Player(), and SetInWater().

◆ m_itemDuration

◆ m_items

◆ m_itemSoulboundTradeable

ItemDurationList Player::m_itemSoulboundTradeable
protected

◆ m_itemUpdateQueue

std::vector<Item*> Player::m_itemUpdateQueue
protected

◆ m_itemUpdateQueueBlocked

bool Player::m_itemUpdateQueueBlocked
protected

◆ m_Last_tick

time_t Player::m_Last_tick

Referenced by Create(), Player(), and Update().

◆ m_lastDailyQuestTime

time_t Player::m_lastDailyQuestTime
protected

◆ m_lastFallTime

uint32 Player::m_lastFallTime
private

◆ m_lastFallZ

float Player::m_lastFallZ
private

◆ m_lastHonorUpdateTime

time_t Player::m_lastHonorUpdateTime
protected

◆ m_lastpetnumber

uint32 Player::m_lastpetnumber
protected

◆ m_lastPotionId

uint32 Player::m_lastPotionId
protected

◆ m_logintime

time_t Player::m_logintime

Referenced by AddItemToBuyBackSlot(), and Player().

◆ m_lootGuid

ObjectGuid Player::m_lootGuid
protected

Referenced by GetLootGUID(), and SetLootGUID().

◆ m_mail

◆ m_mailsUpdated

◆ m_mapRef

MapReference Player::m_mapRef
private

Referenced by GetMapRef(), and SetMap().

◆ m_MirrorTimer

int32 Player::m_MirrorTimer[MAX_TIMERS]
private

◆ m_MirrorTimerFlags

uint8 Player::m_MirrorTimerFlags
private

◆ m_MirrorTimerFlagsLast

uint8 Player::m_MirrorTimerFlagsLast
private

◆ m_MonthlyQuestChanged

bool Player::m_MonthlyQuestChanged
protected

◆ m_monthlyquests

◆ m_MountBlockId

uint32 Player::m_MountBlockId
protected

◆ m_mover

◆ m_NeedToSaveGlyphs

bool Player::m_NeedToSaveGlyphs
protected

◆ m_needZoneUpdate

bool Player::m_needZoneUpdate
protected

◆ m_newVisible

std::vector<Unit*> Player::m_newVisible

◆ m_nextMailDelivereTime

time_t Player::m_nextMailDelivereTime

◆ m_nextSave

uint32 Player::m_nextSave
protected

◆ m_OffhandExpertise

float Player::m_OffhandExpertise
protected

◆ m_oldpetspell

uint32 Player::m_oldpetspell
private

◆ m_originalGroup

GroupReference Player::m_originalGroup
protected

◆ m_pendingSpectatorForBG

uint32 Player::m_pendingSpectatorForBG

◆ m_pendingSpectatorInviteInstanceId

uint32 Player::m_pendingSpectatorInviteInstanceId

◆ m_petStable

std::unique_ptr<PetStable> Player::m_petStable
private

◆ m_Played_time

◆ m_powerFraction

float Player::m_powerFraction[MAX_POWERS]
protected

Referenced by Player(), and Regenerate().

◆ m_questRewardTalentCount

uint32 Player::m_questRewardTalentCount
protected

◆ m_QuestStatus

◆ m_QuestStatusSave

◆ m_raidDifficulty

Difficulty Player::m_raidDifficulty
protected

◆ m_raidMapDifficulty

Difficulty Player::m_raidMapDifficulty
protected

◆ m_realDodge

float Player::m_realDodge
protected

◆ m_realParry

float Player::m_realParry
protected

◆ m_recallMap

uint32 Player::m_recallMap

Referenced by Player(), and SaveRecallPosition().

◆ m_recallO

float Player::m_recallO

Referenced by Player(), and SaveRecallPosition().

◆ m_recallX

float Player::m_recallX

Referenced by Player(), and SaveRecallPosition().

◆ m_recallY

float Player::m_recallY

Referenced by Player(), and SaveRecallPosition().

◆ m_recallZ

float Player::m_recallZ

Referenced by Player(), and SaveRecallPosition().

◆ m_receivedSpectatorResetFor

◆ m_refundableItems

RefundableItemsSet Player::m_refundableItems
private

◆ m_regenTimerCount

uint32 Player::m_regenTimerCount
protected

◆ m_reputationMgr

◆ m_resetTalentsCost

uint32 Player::m_resetTalentsCost
protected

◆ m_resetTalentsTime

time_t Player::m_resetTalentsTime
protected

◆ m_resurrectGUID

ObjectGuid Player::m_resurrectGUID
protected

◆ m_resurrectHealth

uint32 Player::m_resurrectHealth
protected

◆ m_resurrectMana

uint32 Player::m_resurrectMana
protected

◆ m_resurrectMap

uint32 Player::m_resurrectMap
protected

◆ m_resurrectX

float Player::m_resurrectX
protected

◆ m_resurrectY

float Player::m_resurrectY
protected

◆ m_resurrectZ

float Player::m_resurrectZ
protected

◆ m_RewardedQuests

◆ m_RewardedQuestsSave

QuestStatusSaveMap Player::m_RewardedQuestsSave
protected

◆ m_runes

◆ m_SeasonalQuestChanged

bool Player::m_SeasonalQuestChanged
protected

◆ m_seasonalquests

◆ m_seer

◆ m_session

◆ m_social

PlayerSocial* Player::m_social
protected

Referenced by GetSocial(), LoadFromDB(), and Player().

◆ m_soulboundTradableLock

std::mutex Player::m_soulboundTradableLock
protected

◆ m_specsCount

◆ m_spellCooldowns

◆ m_spellMods

◆ m_spellModTakingSpell

◆ m_spellPenetrationItemMod

int32 Player::m_spellPenetrationItemMod
protected

◆ m_spells

◆ m_summon_asSpectator

bool Player::m_summon_asSpectator
protected

◆ m_summon_expire

time_t Player::m_summon_expire
protected

◆ m_summon_mapid

uint32 Player::m_summon_mapid
protected

◆ m_summon_x

float Player::m_summon_x
protected

◆ m_summon_y

float Player::m_summon_y
protected

◆ m_summon_z

float Player::m_summon_z
protected

◆ m_swingErrorMsg

uint8 Player::m_swingErrorMsg
protected

Referenced by Player(), and Update().

◆ m_talents

◆ m_taxi

◆ m_team

TeamId Player::m_team
protected

◆ m_temporaryUnsummonedPetNumber

◆ m_timedquests

QuestSet Player::m_timedquests
protected

◆ m_trade

◆ m_usedTalentCount

uint32 Player::m_usedTalentCount
protected

◆ m_weaponChangeTimer

uint32 Player::m_weaponChangeTimer
protected

◆ m_WeaponProficiency

uint32 Player::m_WeaponProficiency
protected

◆ m_WeeklyQuestChanged

bool Player::m_WeeklyQuestChanged
protected

◆ m_weeklyquests

◆ m_zoneUpdateId

uint32 Player::m_zoneUpdateId
protected

◆ m_zoneUpdateTimer

uint32 Player::m_zoneUpdateTimer
protected

Referenced by Player(), Update(), and UpdateZone().

◆ manaBeforeDuel

uint32 Player::manaBeforeDuel
private

◆ mMitems

ItemMap Player::mMitems

◆ mSemaphoreTeleport_Far

time_t Player::mSemaphoreTeleport_Far
private

◆ mSemaphoreTeleport_Near

time_t Player::mSemaphoreTeleport_Near
private

◆ mSkillStatus

◆ PlayerTalkClass

PlayerMenu* Player::PlayerTalkClass

Referenced by AddGossipItemFor(), AddGossipItemFor(), AddGossipItemFor(), ClearGossipMenuFor(), CloseGossipMenuFor(), Spell::EffectQuestStart(), go_wind_stone::go_wind_stoneAI::GossipSelect(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandlePlayerLoginOpcode(), WorldSession::HandlePushQuestToParty(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), WorldSession::HandleQuestgiverCancel(), WorldSession::HandleQuestgiverChooseRewardOpcode(), WorldSession::HandleQuestgiverCompleteQuest(), WorldSession::HandleQuestgiverQueryQuestOpcode(), WorldSession::HandleQuestgiverRequestRewardOpcode(), WorldSession::HandleQuestgiverStatusQueryOpcode(), WorldSession::HandleQuestQueryOpcode(), npc_wg_quest_giver::OnGossipHello(), npc_elder_clearwater::OnGossipHello(), npc_experience::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_cos_chromie_middle::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_icc_buff_switcher::OnGossipSelect(), OnGossipSelect(), Player(), PrepareGossipMenu(), PrepareQuestMenu(), WorldSession::SendBindPoint(), SendGossipMenuFor(), SendPreparedGossip(), SendPreparedQuest(), npc_costumed_orphan_matron::sGossipHello(), npc_pet_trainer::npc_pet_trainerAI::sGossipSelect(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_echo_of_medivh::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_sergeant_bly::npc_sergeant_blyAI::sGossipSelect(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), and ~Player().

◆ pvpInfo

◆ SpellQueue

◆ teleportStore_dest

WorldLocation Player::teleportStore_dest
private

Referenced by GetTeleportDest(), TeleportTo(), and Update().

◆ teleportStore_options

uint32 Player::teleportStore_options
private

Referenced by Player(), TeleportTo(), and Update().

◆ unReadMails

◆ WhisperList


The documentation for this class was generated from the following files: